29 October, 2008 / TargetProcess Customers' Feedback

0 comments

We've conducted TargetProcess survey among our customers. The goal of the survey was to check people happiness, determine most important problems and future product development directions. Overall we've got responses from 65 companies. There will be some posts about results in this blog.

One question was "Your personal feedback as a TP user". See below all the answers (without any shortcuts or changes).

  • best decision we made. thanks
  • Good customer support; generally decent product
  • TP has matured over the last couple of years. It is slowly edging towards a complete package (planning, measuring, logging, bug tracking etc) for agile development. It is still lightweight and doesn't burden the agile process.
  • Great tool with great features. Performance is slowed down by the web interface, so a native UI could be on the wish list for the future.
  • I like it very much, especially for it's completeness (integration of TestCase management and bugtracking into the planning environment is most important and greatly solved with TP); usability, 'orientation', user guidance is sometimes a problem (as pointed out earlier).
  • I like it. It's part of our business now.
  • Loving the progress you all have made. Just would like to see a little more focus on bug-tracking so users can see via Help Desk more info such as when a bug was resolved.
  • couldn't work without it
  • I have enjoyed working with Target Process - both the product and the team. The product has come a very long way in a short time without losing the easy-to-use interface that allows our users to be productive in a very short time. Keep up the good work and let me know how I can help with new versions.
  • Help Desk needs work: Search function for the end user portion, custom fields visible to end users, TP Tray item avail for end users that sends to help desk.
  • Risk management features would be helpful
  • the product overall is wonderful. however, too many of the developers on my team think that the navigation within the interface is too clunky (it's hard to find certain things even though you've seen the screen a thousand times). we do consulting work and the agile process works well for us. i would like to see the time tracking input and reporting become more robust.
  • Excellent tool. Very intuitive and functional. We use it as a help desk for internal requests very often.
  • excelent tool for the price, looking forward for some improvements
  • Very helpful tool, good development team and ability to realize requests in acceptable time frame
  • Please concentrate on making TP better, rather than adding more to it.
  • Overall satisfied.
  • only using a subset of the available features.
  • Thinking of integrating help desk process.
  • Awesome!
  • TP is a great tool, i recommend it and i am a big fan. IF I would give a good feedback based on what I missed during my projects, I would point an attention to the QA section. TP needs to have a history for execution, its really important to keep track of the test execution for all test cicle. I also missed and found a kind limited and confusing the report section. TP needs to have more project managment oriented reports, thinking on stakeholders, like a project summary. I missed the line chart for burndown as well as a planning poker, mainily for distributed teams.
  • TP is good and usable, what's of more concern is the agile method and using stories to plan the release and iteration. The theory is there but turning it into practice is difficult, specially in an engineering project where there isn't so much "end-user" content. If TP would provide guidelines (docs, UI tips, ...) in this area that would be nice.
  • You guys are doing great, the product gets better and better, keep it up!
  • I like the target process product. It fits our needs better than the other products we have evaluated. However, at times it is very frustrating because features are inconsistently implemented. I can edit some table in place but not others. I can filter on some fields but not all of them. I would appreciate if the user interface was more usable and consistent throughout the product.
  • Very pleased overall.
  • Fast, stable and not bloated.
  • Can be even greater with a bit of polish
  • customization and integration are the key likes i have and good support
  • Good product
  • Overall best agile planning tool I've used so far.
  • Very clear easy to learn by all users, not just technical ones. Not overloaded with useless features. Lacks some flexibility.
  • Generally we are all extremely happy with TP. As I said before the one thing that would make us REALLY happy would be better e-mail notifications and the ability to assign individual TestCases withing a story, to different users.
  • Great tool. Be more careful when releasing .10 version had problems (folks lose confidence in the product). Consider actual spreadsheet grid like interface to make it easier to do quick edits (including custom fields). Consider a view that actually addresses a User Story (Card, Conversation, Confirmation). We are using this as a Template in the description for a story.
  • I think with a handful of features, this could improve my situation immesley. Because of the difficulty of resource management and reporting, I can not allow rollout to entire organization. I am hoping that I do not need to evaluate another tool such as VersionOne, but without these tools, I may be put into a position with no choice.
  • As an executive, I mostly need to know high-level status of ongoing initiatives and immediate issues. These are outside of the scope of TP and that's good. (i.e. Don't try to do everything in TP - stick to what you're good at.
  • TP has been a great tool for us. There are lots of areas for improvement, but mostly having an integrated system (features/stories/test cases/bugs/requests) makes it extremely valuable for us for tracking and managing work effort and deliverables
  • Performance and stability are the most critical things that TP need address in all future releases. Regression errors, unhandled exceptions, and lost functionality are really affecting our team's confidence in the tool. And if the application isn't responsive and fast to use, it makes it hard to encourage people to use it.
  • Great tool. But espiacially the Jira integration is not complete.
  • Sometimes a lot of clicks to achieve a specific goal.
  • The development process is only a portion of the lifecycle. We use the reporting system to enable the rest of that lifecycle.
  • Simpler APIs (e.g. RESTful) would help alleviate feature gaps e.g. by running reports outside of TP
  • very easy for new users to pick up and use
  • We are really satisfied - we like the fast update of features and we like the product
  • Very great tool which I like to use and work with.
  • I miss a possibility to start a peson's allocation at a certain date. An allocation always starts "today", never in the future.

Labels: ,



09 October, 2008 / Help Desk Portal Future

1 comments

TargetProcess has Help Desk on board. I think it is important to have close relation with customers, to collect their feedback and react on issues and ideas. We've designed Help Desk Portal for that purpose. It is a separate simple application integrated with TargetProcess via API. Customers may post ideas, requests and questions via Help Desk Portal, vote for requests, post comments.

Over the last year, Help Desk Portal has become quite a popular bit of TargetProcess. People use it a lot. But it suffers from many problems:

  • Search is not there (so far, scheduled for the next release :).
  • When someone posts a request, it is impossible to check for duplicates (what if we have the solution already?)
  • Lack of filters.
  • It is not exciting to use.

The last issue is a tough one. It is quite hard to make people happy when they are using a tool like Help Desk portal. It is a matter of usability and design, but I believe it can be solved.

Curiously, there are several fresh examples of startups that focus on company-customer interaction. I personally like UserVoice and GetSatisfaction. The idea behind is similar to Help Desk Portal, but implementation is a way better. Currently we are evaluating options, but it seems we will move to the same direction.

Labels: ,

0 comments

Sometimes we need to clear cache of NHibernate. For example when the database was changed without using NHibernate. We have created the corresponding handler in web application ClearCache.ashx with the following code:

<%@ WebHandler Language="C#" Class="ClearCache" %>
using System;
using System.Collections;
using System.Web;
using NHibernate;

public class ClearCache : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
      context.Response.ContentType = "text/plain";
    
      //Need to retrieve ISession using your NHibernate session provider. In my case it is done in the following way
      ISession session = Portal.Instance.GetCurrentSession();
    
      DoCacheClearing(session);

      context.Response.Write("Done");
  }

  public void DoCacheClearing(ISession session)
  {
      ISessionFactory factory = session.SessionFactory;

      factory.EvictQueries();

      ICollection types = factory.GetAllClassMetadata().Keys;

      foreach (Type type in types)
          factory.Evict(type);

      foreach (string role in factory.GetAllCollectionMetadata().Keys)
          factory.EvictCollection(role);
  }


  public bool IsReusable { get { return false; } }

}



02 October, 2008 / TargetProcess Development Tricks: Force ExtJS GridPanel skip events processing raised from nested grid panels

0 comments

We got a problem with implementing inner grids based on ExtJS. ExtJS GridPanel reacts on every event from inner GridPanel by default. For example sorting in nested grid causes the sorting in parent. That is not good. Find below the code which will allow to deny the event processing in GridPanel if it is fired in its child grid panel:

Ext.override(Ext.grid.GridPanel, {
    processEvent: function(name, e) {
        var t = e.getTarget();

        if (!t) {
            return;
        }

        if (!this.el) {
            return;
        }

        if (jQuery('#' + this.el.id).find('.x-grid3').length > 1 && jQuery(t).parents('.x-grid3').length > 1) {
            return;
        }

        this.fireEvent(name, e);

        var v = this.view;
        var header = v.findHeaderIndex(t);

        if (header !== false) {
            this.fireEvent("header" + name, this, header, e);
        } else {
            var row = v.findRowIndex(t);
            var cell = v.findCellIndex(t);
            if (row !== false) {
                this.fireEvent("row" + name, this, row, e);
                if (cell !== false) {
                    this.fireEvent("cell" + name, this, row, cell, e);
                }
            }
        }
    }
});



01 October, 2008 / TargetProcess Development Tricks: Setting the custom context to MS SQL Connection

1 comments

We are developing the new audit history mechanism. SQL triggers were added. They do the shadow copy of added/deleted/updated data in important tables such as user story, project. The problem is that we need the custom context in these triggers implementation such as logged user and client date. In other words we need to set some custom info into the connection session before any change.

The code below shows how to set and extract context on MS SQL side:

GO

CREATE PROCEDURE setTpCnt
       @userID INT,
       @clientDate DATETIME
AS

DECLARE @BinVar varbinary(128)

SET @BinVar = CAST(CAST(@userID as nvarchar(20)) +
       '_' + CONVERT(nvarchar(100), @clientDate, 13)
              + '_' AS varbinary(128))

SET CONTEXT_INFO @BinVar

GO

CREATE FUNCTION f_GetLoggedUserID()
       RETURNS INT
       AS
BEGIN
       DECLARE @CONTEXT AS NVARCHAR(120)

       SET @CONTEXT = NULL
   
       SELECT @CONTEXT = CAST(CONTEXT_INFO AS NVARCHAR(120))
                     FROM master.dbo.sysprocesses WHERE spid = @@spid

       IF (@CONTEXT IS NULL)
              RETURN NULL
   
   
       RETURN CAST(SUBSTRING(@CONTEXT, 0, CHARINDEX('_', @CONTEXT)) as INT)
END

GO

CREATE FUNCTION f_GetClientTime()
       RETURNS DATETIME
       AS
BEGIN
       DECLARE @PAD_INDEX AS INT
       DECLARE @CONTEXT AS NVARCHAR(120)

       SET @CONTEXT = NULL
   
       SELECT @CONTEXT = CAST(CONTEXT_INFO AS NVARCHAR(120))
                     FROM master.dbo.sysprocesses WHERE spid = @@spid

       IF (@CONTEXT IS NULL)
              RETURN NULL
   
       SET @PAD_INDEX = CHARINDEX('_', @CONTEXT)
       SET @CONTEXT = SUBSTRING(@CONTEXT, @PAD_INDEX + 1, LEN(@CONTEXT) - @PAD_INDEX)
       SET @CONTEXT = SUBSTRING(@CONTEXT, 0, CHARINDEX('_', @CONTEXT))
   
       RETURN CONVERT(DATETIME, @CONTEXT, 13)
END

GO

We can do the following things with the procedure and functions above

  • We can set the context using stored procedure setTpCnt
  • We can get the logged user anywhere using function f_GetLoggedUserID
  • We can get the client time using the function f_GetClientTime

Now we need to set the context from our client. Only our client knows the logged user id and the date. We need somehow to the call of stored procedure setTpCnt in our C# client. We are using NHibernate. So we need to figure out how to pass the custom context information into every connection which is created by NHibernate. Please find the solution below. We created the custom driver for NHibernate to make a call to stored procedure with setting required value:

#region

using System;
using System.Data;
using System.Data.SqlClient;
using NHibernate.Driver;
using NHibernate.SqlCommand;
using NHibernate.SqlTypes;
using Tp.BusinessObjects.Components.Authentication;

#endregion

namespace Tp.BusinessObjects.Data
{
    public class Driver : SqlClientDriver
    {
        private bool _isSecurityInjected;

        public override IDbConnection CreateConnection()
        {
            var connection = base.CreateConnection();
            _isSecurityInjected = false;
            return connection;
        }

        public override IDbCommand GenerateCommand(CommandType type, 
                SqlString sqlString, SqlType[] parameterTypes)
        {
            var command = base.GenerateCommand(type, sqlString, parameterTypes);

            if (_isSecurityInjected)
                return command;

            var commandText = command.CommandText;

            if (string.IsNullOrEmpty(commandText))
                return command;


            if ((commandText.IndexOf("INSERT ", 
                    StringComparison.InvariantCultureIgnoreCase) < 0)
                && (commandText.IndexOf("UPDATE ", 
                    StringComparison.InvariantCultureIgnoreCase) < 0)
                && (commandText.IndexOf("DELETE ", 
                    StringComparison.InvariantCultureIgnoreCase) < 0))
            {
                return command;
            }

            var userID = UserAuthentication.UserID;

            if (userID != null)
            {
                _isSecurityInjected = true;
                var text = @"EXEC setTpCnt @cnt_userID, @cnt_ClientDate" + Environment.NewLine;
                command.CommandText = text + commandText;
                command.Parameters.Add(new SqlParameter("@cnt_userID", userID));
                command.Parameters.Add(new SqlParameter("@cnt_ClientDate", CurrentDate.Value));
            }

            return command;
        }
    }
}

Now we need to improve NHibernate configuration to include the driver created above. It should be done in the following way

Will keep you informed about other tricks (if have time for sure).

 

We are developing TargetProcess agile project management software and blogging about our progress.

Subscribe to the RSS feed
Stay tuned by having the latest updates via RSS
Follow TargetProcess on Twitter
Get in touch with our team

Try TargetProcess
TargetProcess quick tour