Esempio n. 1
0
        /// <summary>
        /// wait client feedback
        /// </summary>
        /// <param name="fe"></param>

        public void SendEmailtoClientForFeedBack(FeedBacksEntity fe)
        {
            string contentTemplete = GetEmailExecuter("SendEmailToClientForFeedBack.txt");

            string        from     = Config.DefaultSendEmail;
            string        to       = "";
            TicketsEntity te       = ticketsRpst.Get(fe.TicketID);
            var           creators = ticketsUserRpst.GetTicketUser(fe.TicketID, TicketUsersType.Create);
            var           creator  = creators != null && creators.Count > 0 ? creators[0] : null;

            if (creator != null)
            {
                var user = userRpst.Get(creator.UserID);
                to = user.Email;
                string subject = string.Format("Ticket #{0} {1} needs your feedback.", te.TicketCode, te.Title);
                string content = string.Empty;
                if (!string.IsNullOrEmpty(contentTemplete.Trim()))
                {
                    content = contentTemplete.Trim();
                    content = content.Replace("[ClientName]", user.FirstAndLastName);
                    content = content.Replace("[PmName]", GetUnameByRoleTypeAndTicketId(te.TicketID, TicketUsersType.PM));
                }

                emailSender.SendMail(to, @from, subject, content.ToString());
            }
        }
Esempio n. 2
0
        private FeedBacksEntity GetFeedbacksEntity(int ticketID, string content, bool isPublic, bool isWaitClient, bool isWaitPM)
        {
            FeedBacksEntity feedbacksEntity = new FeedBacksEntity();

            feedbacksEntity.IsDelete    = false;
            feedbacksEntity.TicketID    = ticketID;
            feedbacksEntity.Title       = string.Empty;
            feedbacksEntity.Description = content; //content.NoHTML();
            feedbacksEntity.CreatedBy   = UserInfo.UserID;
            feedbacksEntity.CreatedOn   = DateTime.Now;
            feedbacksEntity.ModifiedOn  = DateTime.Now;

            feedbacksEntity.WaitClientFeedback = isWaitClient ? FeedbackReplyStatus.Requested : FeedbackReplyStatus.Normal;
            feedbacksEntity.WaitPMFeedback     = isWaitPM ? FeedbackReplyStatus.Requested : FeedbackReplyStatus.Normal;

            if (UserInfo.Role == RolesEnum.CLIENT || isWaitClient)
            {
                feedbacksEntity.IsPublic = true;
            }
            else
            {
                feedbacksEntity.IsPublic = isPublic;
            }

            return(feedbacksEntity);
        }
Esempio n. 3
0
        /// <summary>
        /// Add a record
        /// </summary>
        public int Insert(FeedBacksEntity model)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("set @Order = [dbo].[GetFeedbackIndexByTicket] (@TicketID);insert into FeedBacks(");
            strSql.Append("TicketID,Title,Description,CreatedBy,CreatedOn,IsDelete,IsPublic,WaitClientFeedback,WaitPMFeedback,[Order])");

            strSql.Append(" values (");
            strSql.Append(@"@TicketID,@Title,@Description,@CreatedBy,@CreatedOn,@IsDelete,@IsPublic,@WaitClientFeedback,@WaitPMFeedback,@Order)");
            strSql.Append(";select ISNULL( SCOPE_IDENTITY(),0);");
            Database db = DatabaseFactory.CreateDatabase();

            using (DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString()))
            {
                db.AddInParameter(dbCommand, "TicketID", DbType.Int32, model.TicketID);
                db.AddInParameter(dbCommand, "Title", DbType.String, model.Title);
                db.AddInParameter(dbCommand, "Description", DbType.String, model.Description);
                db.AddInParameter(dbCommand, "CreatedBy", DbType.Int32, model.CreatedBy);
                db.AddInParameter(dbCommand, "CreatedOn", DbType.DateTime, model.CreatedOn);
                db.AddInParameter(dbCommand, "IsDelete", DbType.Boolean, model.IsDelete);
                db.AddInParameter(dbCommand, "IsPublic", DbType.Boolean, model.IsPublic);
                db.AddInParameter(dbCommand, "WaitClientFeedback", DbType.Int32, (int)model.WaitClientFeedback);
                db.AddInParameter(dbCommand, "WaitPMFeedback", DbType.Int32, (int)model.WaitPMFeedback);
                db.AddOutParameter(dbCommand, "Order", DbType.Int32, 8);
                int    result;
                object obj = db.ExecuteScalar(dbCommand);
                if (!int.TryParse(obj.ToString(), out result))
                {
                    return(0);
                }
                model.Order = int.Parse("0" + db.GetParameterValue(dbCommand, "Order").ToString());
                return(result);
            }
        }
Esempio n. 4
0
        private string FormatOrder(FeedBacksEntity feedback)
        {
            var templates = new Dictionary <int, string>();

            templates.Add((int)FeedbackReplyStatus.Requested, "<span title='{0}' class='feedback_waiting'>#{1}</span>");
            templates.Add((int)FeedbackReplyStatus.Replied, "<span title='{0}' class='feedback_writed'>#{1}</span>");
            var clientStatusTexts = new Dictionary <int, string>();

            clientStatusTexts.Add((int)FeedbackReplyStatus.Requested, "Waiting for Client feedback");
            clientStatusTexts.Add((int)FeedbackReplyStatus.Replied, "Replied");
            var sunnetStatusTexts = new Dictionary <int, string>();

            sunnetStatusTexts.Add((int)FeedbackReplyStatus.Requested, "Waiting Sunnet feedback");
            sunnetStatusTexts.Add((int)FeedbackReplyStatus.Replied, "Replied");
            if (feedback.WaitClientFeedback != FeedbackReplyStatus.Normal)
            {
                return(string.Format(templates[(int)feedback.WaitClientFeedback],
                                     clientStatusTexts[(int)feedback.WaitClientFeedback], feedback.Order));
            }
            if (feedback.WaitPMFeedback != FeedbackReplyStatus.Normal)
            {
                return(string.Format(templates[(int)feedback.WaitPMFeedback],
                                     sunnetStatusTexts[(int)feedback.WaitPMFeedback], feedback.Order));
            }
            return(string.Format("#{0}", feedback.Order));
        }
Esempio n. 5
0
        protected string ShowReply(object feedbackId, object ticketId, object WaitClientFeedback, object WaitPMFeedback)
        {
            FeedBacksEntity entity = fbApp.GetFeedBacksEntity((int)feedbackId);

            if (((entity.CreatedBy == UserInfo.UserID) ||
                 (UserInfo.UserType == "SUNNET" || ticketEntity(ticketId).CompanyID == UserInfo.CompanyID)) &&
                ticketEntity(ticketId).Status != TicketsState.Completed &&
                ticketEntity(ticketId).Status != TicketsState.Cancelled)
            {
                if (UserInfo.Role == RolesEnum.CLIENT && (int)WaitClientFeedback == 1)
                {
                    return(string.Format("<a href=\"###\" onclick=\"OpenReplyFeedBackDialog({0},{1})\" title=\"Need FeedBack\"><img src=\"/icons/needReply.gif\" alt=\"Need FeedBack\" /></a>"
                                         , feedbackId, ticketId));
                }
                else if (UserInfo.Role == RolesEnum.PM && (int)WaitPMFeedback == 1)
                {
                    return(string.Format("<a href=\"###\" onclick=\"OpenReplyFeedBackDialog({0},{1})\" title=\"Need FeedBack\"><img src=\"/icons/needReply.gif\" alt=\"Need FeedBack\" /></a>"
                                         , feedbackId, ticketId));
                }
                else if ((int)WaitClientFeedback != 1 && (int)WaitPMFeedback != 1)
                {
                    return(string.Format("<a href=\"###\" onclick=\"OpenReplyFeedBackDialog({0},{1})\" title=\"Reply FeedBack\"><img src=\"/icons/reply.gif\" alt=\"Reply FeedBack\" /></a>"
                                         , feedbackId, ticketId));
                }
            }
            return("");
        }
Esempio n. 6
0
        public List <FeedBacksEntity> GetFeedBackListByTicketId(int tid, bool isSunnet, bool isSunneter
                                                                , bool isPM, bool isSupervisor)
        {
            List <FeedBacksEntity> list = new List <FeedBacksEntity>();

            StringBuilder strSql = new StringBuilder();

            strSql.Append("select * from feedbacks A inner join users B ")
            .Append(" on A.CreatedBy=B.userID")
            .Append(" where TicketID = @TicketID ");

            if (isSunnet && !isSunneter) //Client 只能看pm和client的feedback
            {
                strSql.Clear();
                strSql.Append("select * from feedbacks A inner join users B ")
                .Append("  inner join Roles C on B.RoleID=C.RoleID ")
                .Append(" on A.CreatedBy=B.userID")
                .Append(" where TicketID = @TicketID ")
                .Append("  and (C.RoleName='PM' or C.RoleName='Client' or C.RoleName='Sales')")
                .Append(" and IsPublic = 1");
            }

            if (isSupervisor) //Supervisor 只能看pm和Supervisor的feedback
            {
                strSql.Clear();
                strSql.Append("select * from feedbacks A inner join users B ")
                .Append("  inner join Roles C on B.RoleID=C.RoleID ")
                .Append(" on A.CreatedBy=B.userID")
                .Append(" where TicketID = @TicketID ")
                .Append("  and (C.RoleName='PM' or C.RoleName='Supervisor')");
            }

            strSql.Append(" order by FeedBackID asc ");
            Database db = DatabaseFactory.CreateDatabase();

            using (DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString()))
            {
                try
                {
                    db.AddInParameter(dbCommand, "TicketID", DbType.Int32, tid);
                    using (IDataReader dataReader = db.ExecuteReader(dbCommand))
                    {
                        while (dataReader.Read())
                        {
                            list.Add(FeedBacksEntity.ReaderBind(dataReader));
                        }
                    }
                }
                catch (Exception ex)
                {
                    WebLogAgent.Write(string.Format("[SQLText:{0},{1}Messages:\r\n{2}]", strSql.ToString()
                                                    , base.FormatParameters(dbCommand.Parameters), ex.Message));
                    return(null);
                }
            }
            return(list);
        }
Esempio n. 7
0
        protected void Page_Load(object sender, EventArgs e)
        {
            int tid        = QS("tid", 0);
            int feedbackId = QS("feedbackId", 0);

            if (tid == 0 && feedbackId == 0)
            {
                this.ShowArgumentErrorMessageToClient();
                return;
            }

            #region role

            FeedBacksEntity entity = new FeedBacksEntity();
            if (feedbackId > 0)
            {
                entity = fbAPP.GetFeedBacksEntity(feedbackId);
                if (!CheckSecurity(entity.TicketID))
                {
                    this.ShowArgumentErrorMessageToClient();
                    return;
                }
                entity.Title         = string.Format("<strong>Re:{0}</strong>", entity.Title.Replace("<strong>", "").Replace("</strong>", ""));
                AddFeedBack1.IsReply = true;
                Page.Title           = "Reply Feedback";
            }
            else
            {
                if (!CheckSecurity(tid))
                {
                    this.ShowArgumentErrorMessageToClient();
                    return;
                }
                if (UserInfo.Role == RolesEnum.PM || UserInfo.Role == RolesEnum.ADMIN || UserInfo.Role == RolesEnum.CLIENT)
                {
                    entity.IsPublic = true;
                }
                else
                {
                    entity.IsPublic = false;
                }
                entity.TicketID = tid;
                Page.Title      = "Add FeedBacks";
            }

            ProjectIDResponse = ticketsApp.GetProjectIdAndUserID(entity.TicketID);
            if (null != ProjectIDResponse)
            {
                this.AddFeedBack1.ProjectID = ProjectIDResponse.ProjectId;
            }
            this.AddFeedBack1.FeedBacksEntityInfo = entity;

            #endregion
        }
Esempio n. 8
0
        public string DeleteFeedback(int userID, int feedbackID, int ticketID)
        {
            if (userID != UserID)
            {
                return(ResponseMessage.GetResponse(false, "Unauthorized operation.", 0));
            }
            if (feedbackID == 0)
            {
                return(ResponseMessage.GetResponse(false, "Arguments error.", 0));
            }
            FeedBackApplication feedBackApplication = new FeedBackApplication();

            //先判定feedback是不是public然后判断是不是wait client==1或waitpm ==1如果是并且ticket状态不为normal则改为normal
            FeedBacksEntity feedBacksEntity = feedBackApplication.GetFeedBacksEntity(feedbackID);

            if (feedBacksEntity.WaitClientFeedback == FeedbackReplyStatus.Requested)
            {
                ticketApp.ClearWaitingByType(ticketID, TicketUsersType.Create, TicketUsersType.Client, TicketUsersType.PM);
                ticketApp.DeleteUserFromTicket(ticketID, TicketUsersType.Client);
            }
            if (feedBacksEntity.WaitPMFeedback == FeedbackReplyStatus.Requested)
            {
                var ticketEntity  = ticketApp.GetTickets(ticketID);
                var projectEntity = projectApp.Get(ticketEntity.ProjectID);
                if (ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal,
                                                 TicketUsersType.PM, TicketUsersType.Create, TicketUsersType.Client))
                {
                    ticketEntity.ResponsibleUser = PmReplyClient(projectEntity, ticketEntity);
                    ticketApp.UpdateTickets(ticketEntity, false);
                }
            }

            //再删除feedbackmessage,并且feedback状态不为normal则改为normal
            bool result = feedBackApplication.DeleteFeedback(feedbackID);

            if (result)
            {
                return(ResponseMessage.GetResponse(true));
            }
            else
            {
                var tmpMessage = feedBackApplication.BrokenRuleMessages != null &&
                                 feedBackApplication.BrokenRuleMessages.Count > 0
                    ? feedBackApplication.BrokenRuleMessages[0].Message
                    : "";
                return(ResponseMessage.GetResponse(false, tmpMessage));
            }
        }
Esempio n. 9
0
        private FeedBacksEntity GetFeedbacksEntity()
        {
            var feedbacksEntity = new FeedBacksEntity
            {
                IsDelete           = false,
                TicketID           = TicketID,
                Title              = string.Empty,
                Description        = txtDescription.Text,
                CreatedBy          = UserInfo.UserID,
                CreatedOn          = DateTime.Now,
                ModifiedOn         = DateTime.Now,
                IsPublic           = false,
                WaitClientFeedback = FeedbackReplyStatus.Normal,
                WaitPMFeedback     = FeedbackReplyStatus.Normal
            };

            return(feedbacksEntity);
        }
Esempio n. 10
0
        public FeedBacksEntity GetFeedBacksEntity(int id)
        {
            this.ClearBrokenRuleMessages();

            if (id <= 0)
            {
                return(null);
            }

            FeedBacksEntity entity = repository.Get(id);

            if (entity == null)
            {
                this.AddBrokenRuleMessages(mgr.BrokenRuleMessages);
                return(null);
            }

            return(entity);
        }
Esempio n. 11
0
        public void SendEmailtoPMForFeedBack(FeedBacksEntity fe)
        {
            string        to = "";
            TicketsEntity te = ticketsRpst.Get(fe.TicketID);

            te.Status = TicketsState.Submitted;
            to        = SendEmailByTicketState(te);//get pm's email

            //xml 发送邮件
            XElement xmlInvoice1 = XElement.Load(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Template/SendEmailToPmForFeedBack.xml");

            emailBody    = xmlInvoice1.Element("email").Elements("content").First().Value;
            emailSubject = xmlInvoice1.Element("email").Elements("subject").First().Value
                           .Replace("{TicketID}", te.TicketID.ToString())
                           .Replace("{TicketTitle}", te.Title);
            emailBody = emailBody.Replace("{TicketID}", te.TicketID.ToString())
                        .Replace("{userName}", GetNameById(fe.CreatedBy));

            SFConfig.Components.EmailSender.SendMail(to, emailSubject, emailBody, true, MailPriority.Normal);
        }
Esempio n. 12
0
        public int AddFeedBacks(FeedBacksEntity entity)
        {
            this.ClearBrokenRuleMessages();

            BaseValidator <FeedBacksEntity> validator = new AddFeedBacksValidator();


            if (!validator.Validate(entity))
            {
                this.AddBrokenRuleMessages(validator.BrokenRuleMessages);
                return(0);
            }
            int result = repository.Insert(entity);

            if (result <= 0)
            {
                this.AddBrokenRuleMessage();
                return(0);
            }

            return(result);
        }
Esempio n. 13
0
        /// <summary>
        /// Get an object entity
        /// </summary>
        public FeedBacksEntity Get(int FeedBackID)
        {
            StringBuilder strSql = new StringBuilder();

            strSql.Append("select * from FeedBacks ");
            strSql.Append(" where FeedBackID=@FeedBackID");
            Database db = DatabaseFactory.CreateDatabase();

            using (DbCommand dbCommand = db.GetSqlStringCommand(strSql.ToString()))
            {
                db.AddInParameter(dbCommand, "FeedBackID", DbType.Int32, FeedBackID);
                FeedBacksEntity model = null;
                using (IDataReader dataReader = db.ExecuteReader(dbCommand))
                {
                    if (dataReader.Read())
                    {
                        model = FeedBacksEntity.ReaderBind(dataReader);
                    }
                }
                return(model);
            }
        }
Esempio n. 14
0
        protected void btnSave_Click(object sender, EventArgs e)
        {
            int          tmpState    = int.Parse(ddlStatus.SelectedValue);
            TicketsState selectState = (TicketsState)tmpState;

            if (rdoAccounting.SelectedValue == "1")
            {
                //int wid = int.Parse(ddl_Proposal.SelectedValue);
                int wid = int.Parse(hid_Proposal.Value);
                ProposalTrackerRelationEntity model = wrApp.GetProposalTrackerByTid(ticketID);
                if (model == null || model.ID == 0)
                {
                    model.CreatedBy = IdentityContext.UserID;
                    model.TID       = ticketID;
                    model.WID       = wid;
                    wrApp.AddProposalTrackerRelation(model);
                }
                else
                {
                    if (model.TID != ticketID || model.WID != wid)
                    {
                        model.TID = ticketID;
                        model.WID = wid;
                        wrApp.UpdateProposalByProposal(model);
                    }
                }
            }
            else
            {
                ProposalTrackerRelationEntity model = wrApp.GetProposalTrackerByTid(ticketID);
                if (model != null || model.ID > 0)
                {
                    wrApp.DelProposalTrackerRelationByID(model.ID);
                }
            }

            bool result = false;
            //指定初次估时者
            int estimationUserID = 0;

            bool isEstimation = rdoEstimationYes.Checked;

            if (isEstimation && selectState == TicketsState.PM_Reviewed)
            {
                if (!int.TryParse(QF(ddlEstUser.UniqueID), out estimationUserID))
                {
                    ShowFailMessageToClient("Invalid extimation user.");
                    return;
                }
            }

            //选择accounting

            string accounting = (rdoAccounting.SelectedValue == "" ? "0" : rdoAccounting.SelectedValue);

            ticketsEntity.Accounting = (AccountingState)int.Parse(accounting);


            //指派最终确认估时者
            int confirmEstmateUserId = 0;

            if (selectState == TicketsState.Waiting_Confirm)
            {
                if (!int.TryParse(QF(ddlConfirmEstmateUserId.UniqueID), out confirmEstmateUserId))
                {
                    ShowFailMessageToClient("Invalid Waiting Confirm user.");
                    return;
                }
            }

            decimal initialtionHours;

            //初次估时
            if (!decimal.TryParse(txtInitialTime.Text, out initialtionHours))
            {
                ShowFailMessageToClient("Invalid extimation hour.");
                return;
            }

            decimal extimationHours;

            ///最终估时
            if (!decimal.TryParse(txtBoxExtimationHours.Text, out extimationHours))
            {
                ShowFailMessageToClient("Invalid extimation hour.");
                return;
            }


            ///没有达到预期要求
            if (((TicketsState)int.Parse(ddlStatus.SelectedValue)) == TicketsState.PM_Deny)
            {
                HttpFileCollection files            = Request.Files;
                string             fileuploadErrMsg = string.Empty;
                for (int i = 0; i < files.Count; i++)
                {
                    if (files[i].ContentLength > 0 || txtBoxDenyReason.Text.Trim().Length > 0)
                    {
                        FeedBacksEntity feedbacksEntity = GetFeedbacksEntity();
                        feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity);
                        result             = feedbacksEntity.ID > 0;
                        if (!result)
                        {
                            ShowFailMessageToClient(fbAPP.BrokenRuleMessages);
                            return;
                        }
                        if (files[i].ContentLength > 0 && IsValidFile(files[i].FileName))
                        {
                            if (!InsertFile(files[i], ticketsEntity.ProjectID, false,
                                            feedbacksEntity.ID))
                            {
                                fileuploadErrMsg += files[i].FileName + " Upload failed.";
                                result            = false;
                            }
                        }
                    }
                }
            }

            if (selectState == TicketsState.Estimation_Approved)
            {
                ticketsEntity.ProprosalName = txtProprosalName.Text;
                ticketsEntity.WorkPlanName  = txtWorkPlanName.Text;
                ticketsEntity.WorkScope     = txtWorkScope.Text;
                ticketsEntity.Invoice       = txtInvoice.Text;
            }



            int responsibleUserId;

            int.TryParse(QF(ddlResponsibleUser.UniqueID), out responsibleUserId);
            int oldResponsibleUserId = ticketsEntity.ResponsibleUser;

            ticketsEntity.ResponsibleUser = responsibleUserId;

            ProjectsEntity projectEntity = projApp.Get(ticketsEntity.ProjectID);

            int newClientId = -1;

            if (ddlClient.Visible == true)
            {
                if (ddlClient.SelectedValue != "-1")
                {
                    newClientId = int.Parse(ddlClient.SelectedValue);
                }
            }

            result = ticketApp.PMReview(ticketsEntity, UserInfo, rdoRequestYes.Checked,
                                        ddlStatus.SelectedValue, isEstimation, estimationUserID, confirmEstmateUserId, initialtionHours, extimationHours
                                        , ticketUsersView.GetSelectedUserList(), txtBoxConvertDescr.Text,
                                        txtBoxDenyReason.Text.Trim(), projectEntity.PMID, newClientId);

            if (ddlClient.Visible == true)
            {
                if (ddlClient.SelectedValue != "-1")
                {
                    ticketApp.UpdateCreateUser(int.Parse(ddlClient.SelectedValue), ticketsEntity.TicketID);
                }
            }

            if (result)
            {
                //sent email to responsible user 2017/10/23
                if (oldResponsibleUserId != ticketsEntity.ResponsibleUser)
                {
                    ticketApp.SendEmailToResponsibile(ticketsEntity, UserInfo);
                }
                // 更新所有相关人员的WorkingOn状态
                ticketApp.UpdateWorkingOnStatus(ticketID, selectState);
                Redirect(EmptyPopPageUrl, false, true);
            }
            else
            {
                ShowFailMessageToClient();
            }
        }
Esempio n. 15
0
 public bool Update(FeedBacksEntity entity)
 {
     throw new NotImplementedException();
 }
Esempio n. 16
0
        public string AddFeedback(int projectID, int ticketID, string content, bool isPublic, bool isWaitClient,
                                  bool isWaitSunnetFeedback, string file, string clientsIds, HttpServerUtility Server)
        {
            try
            {
                ProjectsEntity  ProjectEntity   = projectApp.Get(projectID);
                FeedBacksEntity feedbacksEntity = GetFeedbacksEntity(ticketID, content, isPublic, isWaitClient, isWaitSunnetFeedback);
                TicketsEntity   ticket          = ticketApp.GetTickets(ticketID);

                var canAddWaiting = ticketApp.CanFeedbackWaiting(ticketID);
                if (!canAddWaiting)
                {
                    feedbacksEntity.WaitPMFeedback = feedbacksEntity.WaitClientFeedback = FeedbackReplyStatus.Normal;
                }

                string fileuploadErrMsg = string.Empty;

                feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity);
                if (feedbacksEntity.ID <= 0)
                {
                    var msg = fbAPP.BrokenRuleMessages != null && fbAPP.BrokenRuleMessages.Count > 0
                        ? fbAPP.BrokenRuleMessages[0].Message
                        : "";
                    return(ResponseMessage.GetResponse(false, msg));
                }

                // 产生气泡提示
                if (UserInfo.Role == RolesEnum.CLIENT || isPublic)
                {
                    ticketApp.CreateNotification(ticketID, UserInfo.UserID, false);
                }
                else
                {
                    ticketApp.CreateNotification(ticketID, UserInfo.UserID);
                }

                var extraStatus = new Dictionary <string, bool>();
                // 在添加FeedbackMessage时要更新Ticket 对相关人员的状态, 并且不能覆盖状态

                if (ticket.Status != TicketsState.Wait_Sunnet_Feedback &&
                    ticket.Status != TicketsState.Wait_Client_Feedback &&
                    canAddWaiting)
                {
                    if ((UserInfo.Role == RolesEnum.PM || UserInfo.Role == RolesEnum.Sales) && isWaitClient)
                    {
                        ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitClientFeedback, UserID);
                        extraStatus.Add("waitSunnet", ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitClientFeedback, TicketUsersType.Create));
                        new SendHandler(() => ticketStatusMgr.SendEmailtoClientForFeedBack(feedbacksEntity))
                        .BeginInvoke(null, null);

                        ProcessOtherClients(clientsIds, ticketID);
                    }
                    else if (UserInfo.Role == RolesEnum.CLIENT)
                    {
                        if (isWaitSunnetFeedback)
                        {
                            ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitSunnetFeedback, UserID);
                            extraStatus.Add("waitClient", ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.WaitSunnetFeedback, TicketUsersType.PM));
                        }
                        new SendHandler(() => ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity))
                        .BeginInvoke(null, null);
                    }
                }
                else
                {
                    // 相关状态人员可以通过回复清除自己的状态标识
                    if ((UserInfo.Role == RolesEnum.PM || UserInfo.Role == RolesEnum.Sales) && ticket.Status == TicketsState.Wait_Sunnet_Feedback && isPublic)
                    {
                        // Sunnet 直接清除PM的标识
                        if (ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.PM) &&
                            fbAPP.ReplyFeedback(ticketID, true, false))
                        {
                            ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.Create,
                                                         TicketUsersType.Client);
                            ticket.ResponsibleUser = PmReplyClient(ProjectEntity, ticket);
                            extraStatus.Add("clearSunnet", true);
                            var createrId = ticketApp.GetTicketCreateUser(ticketID);
                            var creater   = _userApp.GetUser(createrId.UserID);
                            new SendHandler(() => ticketStatusMgr.SendEmailFeedbackReplied(UserInfo, creater, ticketID))
                            .BeginInvoke(null, null);
                        }
                    }
                    if (UserInfo.Role == RolesEnum.CLIENT && ticket.Status == TicketsState.Wait_Client_Feedback)
                    {
                        // 客户方面只能清除自己的标识,因为可能需要多个客户回复
                        if (ticketApp.TryClearWaiting(ticketID, UserID, TicketUsersType.Create, TicketUsersType.Client) &&
                            fbAPP.ReplyFeedback(ticketID, false, true))
                        {
                            ticketApp.UpdateTicketStatus(ticketID, UserTicketStatus.Normal, TicketUsersType.PM);
                            extraStatus.Add("clearClient", true);
                            var pmId = ticketApp.GetTicketPM(ticketID);
                            var pm   = _userApp.GetUser(pmId.UserID);
                            new SendHandler(() => ticketStatusMgr.SendEmailFeedbackReplied(UserInfo, pm, ticketID))
                            .BeginInvoke(null, null);

                            ticketApp.DeleteUserFromTicket(ticketID, TicketUsersType.Client);
                        }
                    }
                }
                ticket.ModifiedOn = DateTime.Now;
                if (UserInfo.Role == RolesEnum.CLIENT && isWaitSunnetFeedback)
                {
                    ChangeResponsUserToProjectManager(ProjectEntity, ticket);
                }

                ticketApp.UpdateTickets(ticket, false);

                #region add file

                int      fileID       = 0;
                string   realFileName = "";
                string[] files        = file.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                Dictionary <string, int> uploadedFiles = new Dictionary <string, int>();
                foreach (var f in files)
                {
                    if ((fileID =
                             InsertFile(f, ProjectEntity.ProjectID, ticketID, feedbacksEntity.IsPublic,
                                        feedbacksEntity.ID, Server, out realFileName)) < 1)
                    {
                        fileuploadErrMsg += realFileName + " Upload failed.";
                    }
                    uploadedFiles.Add(realFileName, fileID);
                }

                #endregion

                if (string.IsNullOrEmpty(fileuploadErrMsg))
                {
                    ResponseMessage response = new ResponseMessage();
                    response.Success = true;

                    object attachement          = null;
                    object attachementBasicInfo = null;
                    if (uploadedFiles.Count > 0)
                    {
                        attachement = uploadedFiles;
                        string[] imgFormat = ".gif,.jpg,.jpeg,.bmp,.png,.svg,.raw".Split(new char[] { ',' });
                        attachementBasicInfo = uploadedFiles.Select(it => new
                        {
                            Key   = it.Key,
                            Value = imgFormat.Any(format => format == Path.GetExtension(it.Key.ToLower())) ? fileApp.Get(it.Value).FilePath : "/Images/icons/file.png"
                        }).ToDictionary(it => it.Key, it => it.Value);
                    }

                    feedbacksEntity.Description = new HtmlHelper().ReplaceUrl(feedbacksEntity.Description);

                    response.Data = new
                    {
                        content     = feedback.FormatHTML(feedbacksEntity.Description, Server).Replace("\n", "<br/>"),
                        id          = feedbacksEntity.ID,
                        date        = feedbacksEntity.CreatedOn.ToString("MM/dd/yyyy"),
                        time        = feedbacksEntity.CreatedOn.ToString("hh:mm tt"),
                        order       = feedbacksEntity.Order,
                        createdBy   = feedbacksEntity.CreatedBy,
                        firstname   = UserInfo.FirstName,
                        lastname    = UserInfo.LastName,
                        file        = attachement,
                        basicInfo   = attachementBasicInfo,
                        extraStatus = extraStatus,
                        tdCss       = feedbacksEntity.IsPublic && UserInfo.Role == RolesEnum.PM ? "fdcontentBox3" : "fdcontentBox2"
                    };

                    return(response.ToString());
                }
                else
                {
                    return(ResponseMessage.GetResponse(false, fileuploadErrMsg));
                }
            }
            catch (Exception ex)
            {
                WebLogAgent.Write(string.Format("Error Ascx:FeedbackList.ascx Messages:\r\n{0}", ex));
                return(ResponseMessage.GetResponse(false, ex.Message));
            }
        }
Esempio n. 17
0
        protected void Page_Load(object sender, EventArgs e)
        {
            int tid        = QS("tid", 0);
            int feedbackId = QS("feedbackId", 0);

            if (tid == 0 && feedbackId == 0)
            {
                this.ShowArgumentErrorMessageToClient();
                return;
            }

            GetProjectIdAndUserIDResponse projectidanduseridResponse = new GetProjectIdAndUserIDResponse();

            if (!IsPostBack)
            {
                #region role
                if (feedbackId > 0) //回复
                {
                    FeedBacksEntity entity = fbAPP.GetFeedBacksEntity(feedbackId);
                    projectidanduseridResponse = ticketsApp.GetProjectIdAndUserID(entity.TicketID);
                    if (!CheckSecurity(projectidanduseridResponse))
                    {
                        this.ShowArgumentErrorMessageToClient();
                        return;
                    }
                    txtTitle.Value    = string.Format("Re:{0}", entity.Title);
                    Page.Title        = "Reply Note";
                    bannerTitle.Text  = "Reply Note";
                    trOthers.Visible  = false;
                    trOriDesc.Visible = true;
                    trOriFile.Visible = true;
                    trOriDate.Visible = true;
                    lblDate.InnerText = entity.CreatedOn.ToString("MM/dd/yyyy");
                    txtOriginalContent.Attributes["readonly"] = "readonly";
                    this.txtOriginalContent.Value             = entity.Description;
                    this.lblFiles.InnerHtml = ShowImageList(entity.FeedBackID);

                    hdTicketID.Value = entity.TicketID.ToString();
                }
                else //添加
                {
                    hdTicketID.Value = QS("tid");
                    if (UserInfo.Role == RolesEnum.CLIENT)
                    {
                        if (!string.IsNullOrEmpty(QS("deny")))
                        {
                            Page.Title       = "Add Reason";
                            bannerTitle.Text = "Add Reason";
                            txtTitle.Value   = "Deny Reason";
                        }
                        trOthers.Visible = false;
                    }
                    else
                    {
                        trOthers.Visible        = true;
                        this.ckIsPublic.Visible = true;
                        this.ckIsPublic.Checked = true;
                        this.chkIsWaitClientFeedback.Visible = true;
                    }
                    projectidanduseridResponse = ticketsApp.GetProjectIdAndUserID(tid);
                }
                hdProjectID.Value = projectidanduseridResponse.ProjectId.ToString();
            }
            #endregion
        }
Esempio n. 18
0
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            //添加ticket的Rating, 和Feedback
            int star;

            if (!int.TryParse(hdStar.Value, out star))
            {
                star = 0;
            }
            int ticketID = QS("tid", 0);

            if (ticketID != 0)
            {
                TicketsApplication ticketsApplication = new TicketsApplication();
                if (ticketsApplication.UpdateTicketStar(ticketID, star))
                {
                    //添加Feedback
                    bool isSuccess = UpdateTicketStatusToApprove(ticketID);

                    if (isSuccess)
                    {
                        if (txtFeedback.Text.Trim() != string.Empty)
                        {
                            FeedBacksEntity feedbacksEntity = new FeedBacksEntity();
                            feedbacksEntity.IsDelete           = false;
                            feedbacksEntity.TicketID           = ticketID;
                            feedbacksEntity.Title              = "";
                            feedbacksEntity.Description        = txtFeedback.Text.NoHTML();
                            feedbacksEntity.CreatedBy          = UserInfo.UserID;
                            feedbacksEntity.CreatedOn          = DateTime.Now;
                            feedbacksEntity.ModifiedOn         = DateTime.Now;
                            feedbacksEntity.IsPublic           = true;
                            feedbacksEntity.WaitClientFeedback = FeedbackReplyStatus.Normal;
                            feedbacksEntity.WaitPMFeedback     = FeedbackReplyStatus.Normal;

                            feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity);

                            if (feedbacksEntity.ID <= 0)
                            {
                                ShowFailMessageToClient();
                                return;
                            }
                            ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);//状态更新,不进行刷新气泡
                            //if (ticketAPP.CreateNotification(ticketID,UserInfo.UserID))
                            //{
                            //    //发邮件给PM
                            //    ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);
                            //}
                        }

                        string returnurl = Request.QueryString["returnurl"];
                        if (string.IsNullOrEmpty(returnurl))
                        {
                            Redirect(Request.RawUrl, false, true);
                        }
                        else
                        {
                            ParentToUrl(returnurl);
                        }
                    }
                    else
                    {
                        ShowFailMessageToClient("Update ticket’s status fail.");
                    }
                }
            }
            else
            {
                ShowFailMessageToClient("Update ticket’s status fail.");
            }
        }
Esempio n. 19
0
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            //保存状态。
            //如果需要估时则保存估时
            bool result = true;

            if (IsETA)
            {
                decimal etahours = 0;
                if (decimal.TryParse(txtBoxExtimationHours.Text, out etahours))
                {
                    _ticketEntity.InitialTime = etahours;
                }
            }
            if (!result)
            {
                ShowFailMessageToClient(ticketApp.BrokenRuleMessages);
                return;
            }
            var currentState = ddlStatus.SelectedValue.ToEnum <TicketsState>();

            _ticketEntity.Status     = currentState;
            _ticketEntity.ModifiedBy = UserInfo.UserID;
            _ticketEntity.ModifiedOn = DateTime.Now;
            int            oldResponsibleUserId = _ticketEntity.ResponsibleUser;
            ProjectsEntity projectEntity        = projectApp.Get(_ticketEntity.ProjectID);

            _ticketEntity.ResponsibleUser = int.Parse(ddlResponsibleUser.SelectedValue);

            result = ticketApp.UpdateTickets(_ticketEntity);
            if (result)
            {
                //sent email to responsible user 2017/10/23
                if (oldResponsibleUserId != _ticketEntity.ResponsibleUser)
                {
                    ticketApp.SendEmailToResponsibile(_ticketEntity, UserInfo);
                }
            }
            if (!result)
            {
                ShowFailMessageToClient(ticketApp.BrokenRuleMessages);
                return;
            }
            if (!IsETA && (currentState == TicketsState.Tested_Fail_On_Local || currentState == TicketsState.Tested_Fail_On_Client))
            {
                FilesEntity        fileEntity       = new FilesEntity();
                HttpFileCollection files            = Request.Files;
                string             fileuploadErrMsg = string.Empty;
                for (int i = 0; i < files.Count; i++)
                {
                    if (files[i].ContentLength > 0 || txtDescription.Text.Trim().Length > 0 && IsValidFile(files[i].FileName))
                    {
                        FeedBacksEntity feedbacksEntity = GetFeedbacksEntity();
                        feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity);
                        result             = feedbacksEntity.ID > 0;
                        if (!result)
                        {
                            ShowFailMessageToClient(fbAPP.BrokenRuleMessages);
                            return;
                        }
                        if (files[i].ContentLength > 0 && IsValidFile(files[i].FileName))
                        {
                            if (!InsertFile(files[i], _ticketEntity.ProjectID, feedbacksEntity.IsPublic,
                                            feedbacksEntity.ID))
                            {
                                fileuploadErrMsg += files[i].FileName + " Upload failed.";
                                result            = false;
                            }
                        }
                    }
                }
                if (!result)
                {
                    ShowFailMessageToClient(fileuploadErrMsg);
                    return;
                }
            }
            if (result)
            {
                Redirect(EmptyPopPageUrl, false, true);
            }
            else
            {
                ShowFailMessageToClient(ticketApp.BrokenRuleMessages);
            }
        }
Esempio n. 20
0
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            int ticketID = QS("tid", 0);

            if (ticketID != 0)
            {
                bool isSuccess = UpdateTicketStatusToDeny(ticketID);
                if (isSuccess)
                {
                    if (txtDescription.Text.Trim() != "" || (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0))
                    {
                        FeedBacksEntity feedbacksEntity = new FeedBacksEntity();
                        feedbacksEntity.IsDelete           = false;
                        feedbacksEntity.TicketID           = ticketID;
                        feedbacksEntity.Title              = "";
                        feedbacksEntity.Description        = txtDescription.Text.Trim().NoHTML();
                        feedbacksEntity.CreatedBy          = UserInfo.UserID;
                        feedbacksEntity.CreatedOn          = DateTime.Now;
                        feedbacksEntity.ModifiedOn         = DateTime.Now;
                        feedbacksEntity.IsPublic           = true;
                        feedbacksEntity.WaitClientFeedback = FeedbackReplyStatus.Normal;
                        feedbacksEntity.WaitPMFeedback     = FeedbackReplyStatus.Normal;

                        feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity);

                        if (feedbacksEntity.ID <= 0)
                        {
                            ShowFailMessageToClient();
                            return;
                        }
                        ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);//状态更新不进行跟新气泡,by dave 2017/09/22

                        //if (ticketAPP.CreateNotification(ticketID,UserInfo.UserID))
                        //{
                        //    //发邮件给PM
                        //    ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);
                        //}

                        HttpFileCollection files            = Request.Files;
                        string             fileuploadErrMsg = string.Empty;
                        TicketsEntity      ticketsEntity    = new TicketsApplication().GetTickets(feedbacksEntity.TicketID);
                        for (int i = 0; i < files.Count; i++)
                        {
                            if (files[i].ContentLength > 0 && IsValidFile(files[i].FileName))
                            {
                                if (!InsertFile(files[i], ticketsEntity.ProjectID, feedbacksEntity.TicketID, feedbacksEntity.IsPublic, feedbacksEntity.ID))
                                {
                                    fileuploadErrMsg += files[i].FileName + " Upload failed.";
                                }
                            }
                        }
                        if (!string.IsNullOrEmpty(fileuploadErrMsg))
                        {
                            ShowFailMessageToClient(fileuploadErrMsg);
                            return;
                        }
                    }

                    string returnurl = Request.QueryString["returnurl"];
                    if (string.IsNullOrEmpty(returnurl))
                    {
                        Redirect(Request.RawUrl, false, true);
                    }
                    else
                    {
                        ParentToUrl(returnurl);
                    }
                }
                else
                {
                    ShowFailMessageToClient("Update ticket’s status fail.");
                }
            }
            else
            {
                ShowFailMessageToClient("Update ticket’s status fail.");
            }
        }
Esempio n. 21
0
        protected void btnSave_Click(object sender, EventArgs e)
        {
            FeedBacksEntity feedbacksEntity = new FeedBacksEntity();

            feedbacksEntity.IsDelete    = false;
            feedbacksEntity.TicketID    = int.Parse(hdTicketID.Value);
            feedbacksEntity.Title       = NoHTML(txtTitle.Value);
            feedbacksEntity.Description = txtContent.Value;
            feedbacksEntity.CreatedBy   = UserInfo.UserID;
            feedbacksEntity.CreatedOn   = DateTime.Now;
            feedbacksEntity.ModifiedOn  = DateTime.Now;
            //如果是Client则IsPublic为true, 否则就看IsPublic Checkbox是否有选中。
            feedbacksEntity.IsPublic           = UserInfo.Role == RolesEnum.CLIENT ? true : ckIsPublic.Checked;
            feedbacksEntity.WaitClientFeedback = chkIsWaitClientFeedback.Checked ? 1 : 0;
            feedbacksEntity.WaitPMFeedback     = 0;
            if (feedbacksEntity.WaitClientFeedback > 0)
            {
                feedbacksEntity.IsPublic = true;
            }

            feedbacksEntity.ID = fbAPP.AddFeedBacks(feedbacksEntity);

            if (feedbacksEntity.ID <= 0)
            {
                ShowFailMessageToClient();
                return;
            }

            if (QS("feedbackId", 0) > 0) //回复
            {
                FeedBacksEntity entity = fbAPP.GetFeedBacksEntity(QS("feedbackId", 0));
                if (entity.WaitClientFeedback == 1)  //删除通知Client回复的消息,并且将 需要回复的 Feedbacks标记为已回复
                {
                    fbmApp.DeleteClientFeedback(feedbacksEntity.CreatedBy, entity.TicketID, entity.FeedBackID);
                }
            }

            if (fbmApp.Add(feedbacksEntity)) //feedbackmessages
            {
                if (feedbacksEntity.WaitClientFeedback > 0 ||
                    (feedbacksEntity.WaitClientFeedback <= 0 &&
                     feedbacksEntity.IsPublic)) //发邮件通知 PM
                {
                    //发邮件给PM
                    ticketStatusMgr.SendEmailtoPMForFeedBack(feedbacksEntity);
                }
            }


            if (fileUpload.PostedFile.ContentLength > 0)
            {
                string FolderName = string.Empty;
                FolderName = hdProjectID.Value;
                string filderPath    = System.Configuration.ConfigurationManager.AppSettings["FolderPath"]; //~/path
                string savepath      = Server.MapPath(filderPath) + FolderName;
                string filename      = fileUpload.PostedFile.FileName;
                string fileExtension = Path.GetExtension(filename);

                if (!Directory.Exists(savepath))
                {
                    Directory.CreateDirectory(savepath);
                }

                string sNewFileName = string.Format("{0}_{1}{2}", feedbacksEntity.ID, DateTime.Now.ToString("yyMMddssmm"), fileExtension);

                fileUpload.PostedFile.SaveAs(savepath + @"\" + sNewFileName);

                FilesEntity fileEntity = new FilesEntity();

                fileEntity.ContentType = fileExtension.ToLower();
                fileEntity.CreatedBy   = UserInfo.UserID;
                fileEntity.FilePath    = filderPath.Substring(2) + FolderName + @"/" + sNewFileName;
                fileEntity.FileSize    = fileUpload.PostedFile.ContentLength;
                fileEntity.FileTitle   = filename.Substring(0, filename.LastIndexOf('.'));
                fileEntity.IsPublic    = true;
                fileEntity.ProjectId   = int.Parse(hdProjectID.Value);
                fileEntity.TicketId    = int.Parse(hdTicketID.Value);
                fileEntity.CreatedOn   = DateTime.Now.Date;
                fileEntity.FeedbackId  = feedbacksEntity.ID;
                fileEntity.SourceType  = (int)FileSourceType.FeedBack;
                fileEntity.ThumbPath   = "";
                fileEntity.CompanyID   = ticketsApp.GetCompanyIdByTicketId(int.Parse(hdTicketID.Value));
                int response = new FileApplication().AddFile(fileEntity);
            }
            ShowSuccessMessageToClient(true, true);
        }