private void UpdateColumn(HPMUniqueID projectID, HPMUniqueID taskID, HPMUInt32 colType, string newValue, List<string> multiselections)
        {
            try
            {
                m_VirtSession.ResourceImpersonate(m_ResourceID, EHPMDataHistoryClientOrigin.CustomSDK, m_UpdatedFromWeb);
                switch (colType)
                {
                    case (uint)EHPMProjectDefaultColumn.Risk:
                        {
                            m_VirtSession.TaskSetRisk(taskID, (EHPMTaskRisk)Convert.ToInt32(newValue));
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.Confidence:
                        {
                            m_VirtSession.TaskSetConfidence(taskID, (EHPMTaskConfidence)Convert.ToInt32(newValue));
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.Severity:
                        {
                            m_VirtSession.TaskSetSeverity(taskID, (EHPMTaskSeverity)Convert.ToInt32(newValue));
                        }
                        break;

                    case (uint)EHPMProjectDefaultColumn.BugPriority:
                        {
                            m_VirtSession.TaskSetAgilePriorityCategory(taskID, (EHPMTaskAgilePriorityCategory)Convert.ToInt32(newValue));
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.ItemName:
                        {
                            m_VirtSession.TaskSetDescription(taskID, newValue);
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.CommittedToSprint:
                        {
                            HPMUniqueID linkedToSprintID = new HPMUniqueID(Convert.ToInt32(newValue));

                            HPMUniqueID taskrefid = m_VirtSession.TaskGetMainReference(linkedToSprintID);

                            m_VirtSession.TaskSetLinkedToSprint(taskID, taskrefid);
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.MilestoneTag:
                        {
                            HPMUniqueID linkedToMilestoneID = new HPMUniqueID(Convert.ToInt32(newValue));
                            HPMUniqueID taskrefid = m_VirtSession.TaskGetMainReference(linkedToMilestoneID);

                            HPMTaskLinkedToMilestones milestones = new HPMTaskLinkedToMilestones();
                            Array.Resize(ref milestones.m_Milestones, 1);
                            milestones.m_Milestones[0] = taskrefid;
                            m_VirtSession.TaskSetLinkedToMilestones(taskID, milestones);
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.Hyperlink:
                        {
                            m_VirtSession.TaskSetHyperlink(taskID, newValue);
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.DetailedDescription:
                        {
                            m_VirtSession.TaskSetDetailedDescription(taskID, newValue);
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.StepsToReproduce:
                        {
                            m_VirtSession.TaskSetStepsToReproduce(taskID, newValue);
                        }
                        break;
                    case (uint)EHPMProjectDefaultColumn.Comments:
                        PostNewCommentOnTask(taskID, newValue, m_ResourceID);
                        break;
                    case (uint)EHPMProjectDefaultColumn.CCCommentsTo:
                        {
                            HPMTaskCommentsOptions options = new HPMTaskCommentsOptions();
                            Array.Resize(ref options.m_CCNotificationsTo, multiselections.Count);
                            for (int i = 0; i < multiselections.Count; ++i)
                            {
                                HPMUniqueID resource = new HPMUniqueID(Convert.ToInt32(multiselections[i]));
                                HPMResourceReference reference = new HPMResourceReference();
                                reference.m_ID = resource;
                                if (m_VirtSession.ResourceGroupUtilResourceGroupExists(resource))
                                    reference.m_ResourceType = EHPMResourceGroupingType.ResourceGroup;
                                else
                                    reference.m_ResourceType = EHPMResourceGroupingType.Resource;
                                options.m_CCNotificationsTo[i] = reference;
                            }
                            m_VirtSession.TaskSetCommentsOptions(taskID, options);
                        }
                        break;

                    case (uint)EHPMProjectDefaultColumn.AssignedTo:
                        {
                            HPMTaskResourceAllocation oldAllocation = m_VirtSession.TaskGetResourceAllocation(taskID);

                            HPMTaskResourceAllocation resourceAllocation = new HPMTaskResourceAllocation();
                            Array.Resize(ref resourceAllocation.m_Resources, multiselections.Count);
                            for (int i = 0; i < multiselections.Count; ++i)
                            {
                                HPMTaskResourceAllocationResource resource = new HPMTaskResourceAllocationResource();
                                HPMUniqueID rid = new HPMUniqueID(Convert.ToInt32(multiselections[i]));
                                resource.m_ResourceID = rid;
                                resource.m_PercentAllocated = 100;
                                foreach (HPMTaskResourceAllocationResource oldresource in oldAllocation.m_Resources)
                                {
                                    // if the resource was previously allocated we use the old allocation percent, otherwise set it to 100%
                                    if (resource.m_ResourceID == oldresource.m_ResourceID)
                                    {
                                        resource.m_PercentAllocated = oldresource.m_PercentAllocated;
                                    }
                                }
                                resourceAllocation.m_Resources[i] = resource;
                            }
                            m_VirtSession.TaskSetResourceAllocation(taskID, resourceAllocation, true, EHPMTaskSetStatusFlag.All);
                        }
                        break;

                    case (uint)EHPMProjectDefaultColumn.WorkRemaining:
                        {
                            m_VirtSession.TaskSetWorkRemaining(taskID, Convert.ToInt32(newValue) + 1);
                        }
                        break;

                    case (uint)EHPMProjectDefaultColumn.BugStatus:
                        {
                            HPMInt32 state = Convert.ToInt32(newValue);
                            // Can only change to new status if workflow allows it
                            if (CanProgressToNewStatus(taskID, m_ResourceID, projectID, state))
                            {
                                m_VirtSession.TaskSetWorkflowStatus(taskID, state, EHPMTaskSetStatusFlag.DoAutoAssignments | EHPMTaskSetStatusFlag.DoAutoCompletion);
                            }
                        }
                        break;
                    default:
                        {
                            // custom column
                            HPMProjectCustomColumnsColumn customColumn = m_VirtSession.ProjectGetCustomColumn(projectID, colType);
                            bool doautoassignments = false;
                            string data = "";
                            switch (customColumn.m_Type)
                            {
                                case EHPMProjectCustomColumnsColumnType.DateTime:
                                case EHPMProjectCustomColumnsColumnType.DateTimeWithTime:
                                    {
                                        try
                                        {
                                            DateTime parsedDate = DateTime.Parse(newValue);
                                            data = m_VirtSession.UtilEncodeCustomColumnDateTimeValue(ToHpmTime(parsedDate));
                                        }
                                        catch (FormatException error)
                                        {
                                            SetErrorMessage("Internal error", error.Message);
                                            return;
                                        }
                                    }
                                    break;
                                case EHPMProjectCustomColumnsColumnType.Resources:
                                    {
                                        HPMResourceDefinitionList resourcesToEncode = new HPMResourceDefinitionList();
                                        Array.Resize(ref resourcesToEncode.m_Resources, multiselections.Count);
                                        for (int i = 0; i < multiselections.Count; ++i)
                                        {
                                            HPMUniqueID resource = new HPMUniqueID(Convert.ToInt32(multiselections[i]));
                                            HPMResourceDefinition resourceDef = new HPMResourceDefinition();
                                            resourceDef.m_ID = resource;
                                            if (m_VirtSession.ResourceGroupUtilResourceGroupExists(resource))
                                                resourceDef.m_GroupingType = EHPMResourceGroupingType.ResourceGroup;
                                            else
                                                resourceDef.m_GroupingType = EHPMResourceGroupingType.Resource;
                                            resourcesToEncode.m_Resources[i] = resourceDef;
                                        }
                                        data = m_VirtSession.UtilEncodeCustomColumnResourcesValue(resourcesToEncode, projectID);
                                    }
                                    break;
                                case EHPMProjectCustomColumnsColumnType.IntegerNumber:
                                case EHPMProjectCustomColumnsColumnType.FloatNumber:
                                case EHPMProjectCustomColumnsColumnType.MultiLineText:
                                case EHPMProjectCustomColumnsColumnType.Hyperlink:
                                case EHPMProjectCustomColumnsColumnType.Text:
                                    {
                                        data = newValue;
                                    }
                                    break;

                                case EHPMProjectCustomColumnsColumnType.DropList:
                                    {
                                        data = (newValue == "0") ? "" : newValue;
                                        doautoassignments = true;
                                    }
                                    break;
                                case EHPMProjectCustomColumnsColumnType.MultiSelectionDropList:
                                    {
                                        StringBuilder builder = new StringBuilder();
                                        for (int i = 0; i < multiselections.Count; ++i)
                                        {
                                            if (builder.Length > 0)
                                                builder.Append(";");
                                            string value = (multiselections[i] == "0") ? "" : multiselections[i];
                                            builder.Append(value);
                                        }
                                        data = builder.ToString();
                                        doautoassignments = true;
                                    }
                                    break;
                                // Exercise: add missing types here
                            }

                            m_VirtSession.TaskSetCustomColumnData(taskID, colType, data, doautoassignments);

                        }
                        break;

                }
            }
            catch (HPMSdkException error)
            {
                SetErrorMessage("Could not update task data.", error.ErrorAsStr());
            }
            catch (HPMSdkManagedException error)
            {
                SetErrorMessage("Could not update task data.", error.ErrorAsStr());
            }
            finally
            {
                m_VirtSession.ResourceImpersonate(m_NoUserID, EHPMDataHistoryClientOrigin.CustomSDK, m_NoMessage);
            }
        }
Exemple #2
0
        void Update()
        {
            if (InitConnection())
            {
                try
                {
                    if (m_bBrokenConnection)
                    {
                        DestroyConnection();
                    }
                    else
                    {
                        // Check our stuff
                        HPMUInt64 CurrentTime = GetTimeSince1970();
                        if (CurrentTime > m_NextUpdate)
                        {
                            // Find administrator resource

                            HPMResourceEnum Resources = m_Session.ResourceEnum();

                            HPMUniqueID AdminResourceUID = -1;
                            string      ResourceToFind   = "Administrator";
                            for (HPMUInt32 i = 0; i < Resources.m_Resources.Length && !AdminResourceUID.IsValid(); ++i)
                            {
                                HPMUniqueID           ResourceUID  = Resources.m_Resources[i];
                                HPMResourceProperties ResourceInfo = m_Session.ResourceGetProperties(ResourceUID);;

                                if (ResourceInfo.m_Name == ResourceToFind)
                                {
                                    AdminResourceUID = ResourceUID;
                                }
                            }

                            if (AdminResourceUID.IsValid())
                            {
                                // Enumerate projects
                                HPMProjectEnum Projects = m_Session.ProjectEnum();
                                // Loop through projects
                                for (HPMUInt32 i = 0; i < Projects.m_Projects.Length; ++i)
                                {
                                    // Enumerate tasks
                                    HPMUniqueID          ProjectUID  = Projects.m_Projects[i];
                                    HPMTaskEnum          Tasks       = m_Session.TaskEnum(ProjectUID);
                                    HPMProjectProperties ProjectProp = m_Session.ProjectGetProperties(ProjectUID);

                                    HPMUniqueID OurTaskID   = -1;
                                    string      OurTaskDesc = "HPM SDK Simple Sample Task";
                                    for (HPMUInt32 j = 0; j < Tasks.m_Tasks.Length && !OurTaskID.IsValid(); ++j)
                                    {
                                        string Description = m_Session.TaskGetDescription(Tasks.m_Tasks[j]);
                                        if (Description == OurTaskDesc)
                                        {
                                            OurTaskID = Tasks.m_Tasks[j];
                                        }
                                    }

                                    // Impersonate resource so it looks like this resource made the changes.
                                    // The string in the third argument will be shown in the "Change originates from" column in the change history
                                    m_Session.ResourceImpersonate(AdminResourceUID, EHPMDataHistoryClientOrigin.CustomSDK, m_Session.LocalizationCreateUntranslatedStringFromString("Task updated from Sample_SimpleManaged"));

                                    if (!OurTaskID.IsValid())
                                    {
                                        // No old task was found, create a new one
                                        HPMTaskCreateUnified CreateData = new HPMTaskCreateUnified();
                                        Array.Resize(ref CreateData.m_Tasks, 1);
                                        CreateData.m_Tasks[0] = new HPMTaskCreateUnifiedEntry();

                                        // Set previous to -1 to make it the top task.
                                        HPMTaskCreateUnifiedReference PrevRefID = new HPMTaskCreateUnifiedReference();
                                        PrevRefID.m_RefID = -1;
                                        HPMTaskCreateUnifiedReference PrevWorkPrioRefID = new HPMTaskCreateUnifiedReference();
                                        PrevWorkPrioRefID.m_RefID = -2;

                                        CreateData.m_Tasks[0].m_LocalID               = 1;
                                        CreateData.m_Tasks[0].m_PreviousRefID         = PrevRefID;
                                        CreateData.m_Tasks[0].m_PreviousWorkPrioRefID = PrevWorkPrioRefID;

                                        HPMChangeCallbackData_TaskCreateUnified TaskCreateReturn = m_Session.TaskCreateUnifiedBlock(ProjectUID, CreateData);

                                        if (TaskCreateReturn.m_Tasks.Length == 1)
                                        {
                                            // The returned is a task ref in the project container. We need the task id not the reference id.
                                            HPMUniqueID OurTaskRefID = TaskCreateReturn.m_Tasks[0].m_TaskRefID;
                                            OurTaskID = m_Session.TaskRefGetTask(OurTaskRefID);
                                            m_Session.TaskSetDescription(OurTaskID, OurTaskDesc);
                                            // When we set fully created the task becomes visible to users.
                                            m_Session.TaskSetFullyCreated(OurTaskID);
                                            Console.Write("Successfully created task for project: " + ProjectProp.m_Name + "\r\n");
                                        }
                                        else
                                        {
                                            Console.Write("The wrong number of tasks were created, aborting\r\n");
                                        }
                                    }

                                    if (OurTaskID.IsValid())
                                    {
                                        // Set to todays date
                                        HPMTaskTimeZones Zones = new HPMTaskTimeZones();
                                        Array.Resize(ref Zones.m_Zones, 1);
                                        Zones.m_Zones[0]         = new HPMTaskTimeZonesZone();
                                        Zones.m_Zones[0].m_Start = (CurrentTime / (((HPMUInt64)(60 * 60 * 24)) * 1000000)) * (((HPMUInt64)(60 * 60 * 24)) * 1000000); // We must align the time on whole days
                                        Zones.m_Zones[0].m_End   = Zones.m_Zones[0].m_Start;                                                                          // When the end is the same as the start the task is one day long.
                                        m_Session.TaskSetTimeZones(OurTaskID, Zones, false);
                                        Console.Write("Successfully updated task for project: " + ProjectProp.m_Name + "\r\n");
                                    }
                                }
                            }
                            else
                            {
                                Console.Write("No administrator user was found, aborting.\r\n");
                            }

#if (DEBUG)
                            m_NextUpdate = CurrentTime + 10000000;  // Check every 10 seconds
#else
                            m_NextUpdate = CurrentTime + 120000000; // Check every 120 seconds
#endif
                        }
                    }
                }
                catch (HPMSdkException _Error)
                {
                    Console.Write("Exception in processing loop: " + _Error.ErrorAsStr() + "\r\n");
                }
                catch (HPMSdkManagedException _Error)
                {
                    Console.Write("Exception in processing loop: " + _Error.ErrorAsStr() + "\r\n");
                }
            }
        }