public static JobReferenceCollection GetJobReferencesFromClickKeys(int[] clickKeys)
        {
            DataTable dtResults = null;
            FinalBuild.DataAccess objADO = Domain.GetADOInstance();
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "selJobReferencesFromClickKeys";

            // Assemble Parameters
            objParameter = new DataAccess.ArrayListParameter("JobReferences", clickKeys);
            colParameters.Add(objParameter);

            dtResults = objADO.GetDataSet(strStoredProcedure, objParameter, null).Tables[0];

            return Populate(dtResults);
        }
        public static JobReferenceCollection GetJobReferences(string sourceSystem, int[] sourceIDs)
        {
            DataTable dtResults = null;
            FinalBuild.DataAccess objADO = Domain.GetADOInstance();
            System.Data.SqlClient.SqlParameter[] arrParameters;
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "selJobReferencesFromWMSourceIDs";

            // Assemble Parameters
            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", sourceIDs);
            colParameters.Add(new SqlParameter("@WMSourceSystem", sourceSystem));
            arrParameters = (SqlParameter[])colParameters.ToArray(typeof(SqlParameter));

            dtResults = objADO.GetDataSet(strStoredProcedure, objParameter, arrParameters).Tables[0];

            return Populate(dtResults);
        }
        private bool SaveActivityAssociations()
        {
            DataAccess objADO = Domain.GetADOInstance(Domain.eConnectionName.Metadata);
            ArrayList colParameters = new ArrayList();
            DataAccess.ArrayListParameter arrayParameter = null;
            string strStoredProcedure = "updProjectActivities";
            int intReturn = 0;

            // 1. Update Child Activities (remove current db records not in list passed in)
            colParameters.Add(new SqlParameter("@ActivityID", this.ID));
            if (mColAssociatedActivities != null && mColAssociatedActivities.Count > 0)
            {
                if (mColAssociatedActivities != null && mColAssociatedActivities.Count > 0)
                {
                    int[] childActivities = new int[mColAssociatedActivities.Count];
                    for (int intIndex = 0; intIndex < mColAssociatedActivities.Count; intIndex++)
                    {
                        childActivities[intIndex] = mColAssociatedActivities[intIndex].ID;
                    }
                    arrayParameter = new DataAccess.ArrayListParameter("ChildActivities", childActivities);
                }
            }
            if (arrayParameter != null)
            {
                intReturn = objADO.ExecuteSQL(strStoredProcedure, arrayParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            else
            {
                intReturn = objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }

            // 2. Update LeadTime values for any AssociatedActivities present
            if (mColAssociatedActivities != null && mColAssociatedActivities.Count > 0)
            {
                strStoredProcedure = "updProjectActivityAttributes";
                colParameters.Clear();
                foreach (AssociatedActivityReference activityReference in mColAssociatedActivities)
                {
                    colParameters.Add(new SqlParameter("@ActivityID", this.ID));
                    colParameters.Add(new SqlParameter("@ChildActivityID", activityReference.ID));
                    colParameters.Add(new SqlParameter("@LeadTime", activityReference.LeadTime));
                    intReturn += objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
                    colParameters.Clear();
                }
            }

            objADO = null;

            return (intReturn > 0);
        }
        public bool Save(System.Xml.XmlDocument streamTemplate)
        {
            DataAccess objADO = Domain.GetADOInstance(Domain.eConnectionName.Metadata);
            ArrayList colParameters = new ArrayList();
            DataAccess.ArrayListParameter arrayParameter = null;
            SqlParameter returnParameter = null;
            SqlParameter xmlParameter = null;
            string strStoredProcedure = "updActivity";
            int intReturn = 0;

            if (this.ID > 0)
            {
                colParameters.Add(new SqlParameter("@ActivityID", this.ID));
            }
            else
            {
                strStoredProcedure = "insActivity";
                returnParameter = new SqlParameter("RETURN_VALUE", SqlDbType.Int);
                returnParameter.Direction = ParameterDirection.ReturnValue;
                colParameters.Add(returnParameter);
            }

            colParameters.Add(new SqlParameter("@ActivityCode", this.Code));
            colParameters.Add(new SqlParameter("@CategoryID", mintParentCategoryID));
            colParameters.Add(new SqlParameter("@ActivityDesc", this.Description));
            colParameters.Add(new SqlParameter("@IsReactive", mblnIsReactive));
            colParameters.Add(new SqlParameter("@IsVisibleInClick", mblnIsVisibleInClick));
            colParameters.Add(new SqlParameter("@IsVisibleInField", mblnIsVisibleInField));
            colParameters.Add(new SqlParameter("@AreUtilityPlansRequired", mblnAreUtilityPlansRequired));
            colParameters.Add(new SqlParameter("@IsProject", mblnIsProject));
            colParameters.Add(new SqlParameter("@Duration", mintDuration));
            colParameters.Add(new SqlParameter("@Comments", mstrComments));
            colParameters.Add(new SqlParameter("@MethodOfDetection", mstrMethodOfDetection));
            colParameters.Add(new SqlParameter("@AreSkillsMappedAtActivityLevel", mblnAreSkillsMappedAtActivityLevel)); // AT release 3
            colParameters.Add(new SqlParameter("@IsFailure", mblnIsFailure));

            if (!string.IsNullOrEmpty(this.DistrictGroup))
            {
                colParameters.Add(new SqlParameter("@DistrictGroup", this.DistrictGroup));
            }
            if (!mblnIsProject)
            {
                colParameters.Add(new SqlParameter("@SchedulingPriorityID", mobjSchedulingPriority.ID));
                colParameters.Add(new SqlParameter("@DispatchPriorityID", mobjDispatchPriority.ID));
                if (mstrEarlyStartTime != null && mstrEarlyStartTime != string.Empty)
                {
                    colParameters.Add(new SqlParameter("@EarlyStartTime", mstrEarlyStartTime));
                }
                colParameters.Add(new SqlParameter("@IsDueDateFixed", mblnIsDueDateFixed));
                colParameters.Add(new SqlParameter("@EarlyStartDaysBeforeDue", mintEarlyStartDaysBeforeDue));

                if (mColOnHoldReasons != null && mColOnHoldReasons.Count > 0)
                {
                    int[] onHoldReasonIDs = new int[mColOnHoldReasons.Count];
                    for (int intIndex = 0; intIndex < mColOnHoldReasons.Count; intIndex++)
                    {
                        onHoldReasonIDs[intIndex] = mColOnHoldReasons[intIndex].ID;
                    }
                    arrayParameter = new DataAccess.ArrayListParameter("OnHoldReasons", onHoldReasonIDs);
                }
            }
            if (streamTemplate != null)
            {
                xmlParameter = new SqlParameter("@StreamTemplate", SqlDbType.Xml);
                xmlParameter.Value = new System.Data.SqlTypes.SqlXml(new System.Xml.XmlTextReader(streamTemplate.OuterXml, System.Xml.XmlNodeType.Document, null));
                colParameters.Add(xmlParameter);
            }

            if (arrayParameter != null)
            {
                intReturn = objADO.ExecuteSQL(strStoredProcedure, arrayParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            else
            {
                intReturn = objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            objADO = null;

            if (returnParameter != null && !returnParameter.Value.Equals(DBNull.Value))
            {
                this.ID = (int)returnParameter.Value;
            }

            if (mblnIsProject)
            {
                SaveActivityAssociations();
            }

            FileAssociationCollection currentFileAssociations = GetFileAssociations();
            if (mColFileAssociations == null || mColFileAssociations.Count < 1)
            {
                if (currentFileAssociations != null && currentFileAssociations.Count > 0)
                {
                    // Remove all existing File Associations from database
                    foreach (FileAssociation fileToRemove in currentFileAssociations)
                    {
                        currentFileAssociations.Remove(fileToRemove, this.ID);
                    }
                }
            }
            else
            {
                mColFileAssociations.Save(this.ID);
                if (currentFileAssociations != null && currentFileAssociations.Count > 0)
                {
                    // Remove any File Associations not in ATM updated set from database
                    foreach (FileAssociation fileToRemove in currentFileAssociations)
                    {
                        bool fileFound = false;
                        foreach (FileAssociation fileToKeep in mColFileAssociations)
                        {
                            if (fileToRemove.Path == fileToKeep.Path)
                            {
                                fileFound = true;
                                break;
                            }
                        }
                        if (!fileFound)
                        {
                            currentFileAssociations.Remove(fileToRemove, this.ID);
                        }
                    }
                }
            }
            // AT 160911 need to save skills matrix here
            // Child collection special case - Skills
            if (this.AreSkillsMappedAtActivityLevel)
            {
                SaveSkillsMatrix();
            }


            return (intReturn > 0);
        }
        public bool Save()
        {
            DataAccess objADO = null;
            ArrayList colParameters = new ArrayList();
            DataAccess.ArrayListParameter arrayParameter = null;
            SqlParameter returnParameter = null;
            string strStoredProcedure = "insAssignmentContraints";
            int returnID = 0;

            //SQL SP Paremeters as per below...
            //=======================================
            //@AssignmentConstraintID	int = null, 
            //@WMSourceID int,
            //@InstanceNumber int,
            //@TimeWindow varchar(20)= null, 
            //@Duration int= null, 
            //@StartTime datetime= null, 
            //@EndTime datetime= null,
            //@SpecificStartTime datetime= null, 
            //@MustBeCompletedByTime datetime= null
            //@StartTime_IsUserSet bit = null
            //@SkillCodes varchar(8000) = null

            if (this.UpdateInsideTransaction && this.AssignmentConstraintsDataAccess != null)
            {
                objADO = this.AssignmentConstraintsDataAccess;
            }
            else
            {
                objADO = new DataAccess();
            }


            if (this == null)
            {
                return false;
            }

            if (this.ID > 0)
            {
                colParameters.Add(new SqlParameter("@AssignmentConstraintID", this.ID));
            }

            colParameters.Add(new SqlParameter("@WMSourceID", this.WMSourceID));
            colParameters.Add(new SqlParameter("@InstanceNumber", this.Instance));
            colParameters.Add(new SqlParameter("@TimeWindow", this.TimeWindow.ToString()));

            colParameters.Add(new SqlParameter("@Duration", this.Duration));

            if (this.StartTime != DateTime.MinValue)
            {
                colParameters.Add(new SqlParameter("@StartTime", this.StartTime));
            }

            if (this.EndTime != DateTime.MinValue)
            {
                colParameters.Add(new SqlParameter("@EndTime", this.EndTime));
            }

            if (this.SpecificStartTime != DateTime.MinValue)
            {
                colParameters.Add(new SqlParameter("@SpecificStartTime", this.SpecificStartTime));
            }

            if (this.MustBeCompletedByTime != DateTime.MinValue)
            {
                colParameters.Add(new SqlParameter("@MustBeCompletedByTime", this.MustBeCompletedByTime));
            }

            colParameters.Add(new SqlParameter("@StartTime_IsUserSet", this.IsUserSetStartDate));

            //Skills
            if (this.Skills != null && this.Skills.Count > 0)
            {
                string[] skillCodes = new string[this.Skills.Count];
                for (int intIndex = 0; intIndex < this.Skills.Count; intIndex++)
                {
                    skillCodes[intIndex] = this.Skills[intIndex].Code;
                }
                arrayParameter = new DataAccess.ArrayListParameter("SkillCodes", skillCodes);
            }

            returnParameter = new SqlParameter("RETURN_VALUE", SqlDbType.Int);
            returnParameter.Direction = ParameterDirection.ReturnValue;
            colParameters.Add(returnParameter);

            if (arrayParameter != null)
            {
                returnID = objADO.ExecuteSQL(strStoredProcedure, arrayParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            else
            {
                returnID = objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }

            if (!this.UpdateInsideTransaction)
            {
                objADO = null;
            }

            return (returnID > 0);
        }
        /// <summary>
        /// Release 3 : work item 2422: Added ActivityId parament to save method
        /// </summary>
        /// <param name="ActivityID"></param>
        /// <returns></returns>
        public bool Save(int ActivityID)
        {
            DataAccess objADO = Domain.GetADOInstance(Domain.eConnectionName.Metadata);
            ArrayList colParameters = new ArrayList();
            DataAccess.ArrayListParameter arrayParameter = null;
            SqlParameter returnParameter = null;
            string strStoredProcedure = "updTaskLibrary";
            int intReturn = 0;

            if (this.ID > 0)
            {
                colParameters.Add(new SqlParameter("@TaskID", this.ID));
            }
            else
            {
                strStoredProcedure = "insTaskLibrary";
                returnParameter = new SqlParameter("RETURN_VALUE", SqlDbType.Int);
                returnParameter.Direction = ParameterDirection.ReturnValue;
                colParameters.Add(returnParameter);
            }
            colParameters.Add(new SqlParameter("@Duration", this.Duration));
            colParameters.Add(new SqlParameter("@IsCritical", this.IsCritical));
            colParameters.Add(new SqlParameter("@TaskDesc", this.Description));

            if (ActivityID != -1)
            {
                colParameters.Add(new SqlParameter("@ActivityID", ActivityID));
            }

            if (this.TaskUpdateType != null)
            {
                colParameters.Add(new SqlParameter("@TypeName", this.TaskUpdateType.Name));
            }

            // Child collections
            if (this.MaterialsRequired != null && this.MaterialsRequired.Count > 0)
            {
                string commaSeparatedList = string.Empty;
                for (int intIndex = 0; intIndex < this.MaterialsRequired.Count; intIndex++)
                {
                    commaSeparatedList += this.MaterialsRequired[intIndex].ID.ToString() + ",";
                }
                commaSeparatedList = commaSeparatedList.Substring(0, commaSeparatedList.Length - 1);
                colParameters.Add(new SqlParameter("@Materials", commaSeparatedList));
            }

            if (mColAssociatedActivities != null && mColAssociatedActivities.Count > 0)
            {
                int[] activities = new int[mColAssociatedActivities.Count];
                for (int intIndex = 0; intIndex < activities.Length; intIndex++)
                {
                    activities[intIndex] = mColAssociatedActivities[intIndex].ID;
                }
                arrayParameter = new DataAccess.ArrayListParameter("Activities", activities);
            }
            // Execute SQL
            if (arrayParameter != null)
            {
                intReturn = objADO.ExecuteSQL(strStoredProcedure, arrayParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            else
            {
                intReturn = objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }

            if (returnParameter != null && !returnParameter.Value.Equals(DBNull.Value))
            {
                this.ID = (int)returnParameter.Value;
            }
            objADO = null;

            // Child collection special case - Skills
            SaveSkillsMatrix();


            objADO = null;

            return (intReturn > 0);
        }
        public static List<Job> GetJobsByReference(string[] sourceIDs, eWMSourceSystem sourceSystem, Type inheritedType, bool includeArchived)
        {
            List<Job> colJobs = new List<Job>();
            Job deserializedJob = null;
            DataTable dtResults = null;
            DataAccess objADO = new DataAccess();
            ArrayList colParameters = new ArrayList();
            System.Data.SqlClient.SqlParameter[] arrParameters = null;
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "selJobsByReference";

            objADO = Domain.GetADOInstance();

            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", sourceIDs);
            //If Source System is UnSpecified then it is not relevant .. so any will be returned 
            if (sourceSystem != eWMSourceSystem.Unspecified)
            {
                colParameters.Add(new SqlParameter("@WMSourceSystem", sourceSystem.ToString()));
            }
            if (includeArchived)
            {
                colParameters.Add(new SqlParameter("@IncludeArchived", includeArchived));
            }
            arrParameters = (SqlParameter[])colParameters.ToArray(typeof(SqlParameter));

            dtResults = objADO.GetDataSet(strStoredProcedure, objParameter, arrParameters).Tables[0];
            objADO = null;

            foreach (DataRow drSerializedJob in dtResults.Rows)
            {
                Type inheritedTypeToUse = null;

                if (inheritedType == null)
                {
                    inheritedTypeToUse = Type.GetType(drSerializedJob["TypeName"].ToString());
                }
                else
                {
                    inheritedTypeToUse = inheritedType;
                }

                if (!drSerializedJob["Serialized"].Equals(DBNull.Value))
                {
                    System.Xml.XmlDocument objDOM = new System.Xml.XmlDocument();
                    objDOM.LoadXml(drSerializedJob["Serialized"].ToString());
                    deserializedJob = (Job)BusinessObjects.Base.Deserialize(inheritedTypeToUse, objDOM);
                    if (!drSerializedJob["DateReopened"].Equals(DBNull.Value))
                    {
                        deserializedJob.DateReopened = (DateTime)drSerializedJob["DateReopened"];
                    }

                    // NB: Set properties that are Instance specific to empty\default to avoid confusion
                    deserializedJob.Appointment = null;

                    colJobs.Add(deserializedJob);
                }
            }

            return colJobs;
        }
        public static DataTable GetTravelRelations(int[] jobIDs)
        {
            DataAccess objADO = new DataAccess();
            System.Data.SqlClient.SqlParameter[] arrParameters;
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;

            string strStoredProcedure = "selTravelRelations";
            DataSet dsResults = null;

            // Assemble Parameters
            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", jobIDs);
            arrParameters = (SqlParameter[])colParameters.ToArray(typeof(SqlParameter));

            dsResults = objADO.GetDataSet(strStoredProcedure, objParameter, arrParameters);
            objADO = null;

            return dsResults.Tables[0];
        }
        public static List<AssignmentConstraints> FindAssignmentConstraints(string[] sourceIDs)
        {
            DataAccess objADO = new DataAccess();
            System.Data.SqlClient.SqlParameter[] arrParameters;
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;

            string strStoredProcedure = "selAssignmentContraintsFromSourceIDs";
            DataSet dsResults = null;

            // Assemble Parameters
            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", sourceIDs);
            colParameters.Add(new SqlParameter("@InstanceNumber", 0));
            arrParameters = (SqlParameter[])colParameters.ToArray(typeof(SqlParameter));

            dsResults = objADO.GetDataSet(strStoredProcedure, objParameter, arrParameters);
            objADO = null;

            return PopulateAssignmentConstraintsList(dsResults);
        }
        public static List<Location> GetGeoDataForJobs(string[] sourceIDs)
        {
            List<Location> colLocations = new List<Location>();
            DataTable dtResults = null;
            DataAccess objADO = new DataAccess();
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "selGeoDataForJobs";

            objADO = Domain.GetADOInstance();

            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", sourceIDs);

            dtResults = objADO.GetDataSet(strStoredProcedure, objParameter, null).Tables[0];
            objADO = null;

            Location location = null;
            foreach (DataRow locationRow in dtResults.Rows)
            {
                location = new Location();

                location.ID = int.Parse(locationRow["WMSourceID"].ToString());
                location.PostCode = locationRow["PostCode"].ToString();

                if (!locationRow["Latitude"].Equals(DBNull.Value))
                {
                    location.Latitude = double.Parse(locationRow["Latitude"].ToString());
                }
                if (!locationRow["Longitude"].Equals(DBNull.Value))
                {
                    location.Longitude = double.Parse(locationRow["Longitude"].ToString());
                }

                if (!locationRow["Town"].Equals(DBNull.Value))
                {
                    location.Town = locationRow["Town"].ToString();
                }
                if (!locationRow["Street"].Equals(DBNull.Value))
                {
                    location.Street = locationRow["Street"].ToString();
                }
                if (!locationRow["HouseNo"].Equals(DBNull.Value))
                {
                    int parseResult = 0;
                    if (int.TryParse(locationRow["HouseNo"].ToString(), out parseResult))
                    {
                        location.HouseNo = parseResult;
                    }
                }

                colLocations.Add(location);
            }

            return colLocations;
        }
        public static AssignmentDetailsCollection GetAssignmentsSupportingDataChanged(string userID, string sourceSystem, DateTime lastRunDate, out Hashtable SupportingDataChangeDates)
        {
            AssignmentDetailsCollection assignments = new AssignmentDetailsCollection();
            FinalBuild.DataAccess objADO = Domain.GetADOInstance();
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;
            DataSet dsResults = null;
            int[] wmSourceIDs = null;
            int[] candidateWMSourceIDs = null;
            string strStoredProcedure = "selSupportingDataChanged";
            SupportingDataChangeDates = new Hashtable();

            //Get a list of all unacknowledged Assignment IDs from Mobile WIP
            candidateWMSourceIDs = GetUnAcknowledgedSupportingDataAssignmentIDs(userID);

            // Assemble Parameters
            colParameters.Add(new SqlParameter("@UserID", userID));
            colParameters.Add(new SqlParameter("@LastRunDate", lastRunDate));
            if (sourceSystem != null)
            {
                colParameters.Add(new SqlParameter("@WMSourceSystem", sourceSystem));
            }
            if (candidateWMSourceIDs != null && candidateWMSourceIDs.Length > 0)
            {
                objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", candidateWMSourceIDs);
                dsResults = objADO.GetDataSet(strStoredProcedure, objParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));

            }
            else
            {
                dsResults = objADO.GetDataSet(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }

            if (dsResults != null && dsResults.Tables.Count > 0 && dsResults.Tables[0].Rows.Count > 0)
            {
                wmSourceIDs = PopulateSupportingDataAssignmentIDs(dsResults.Tables[0], out SupportingDataChangeDates);
                assignments = GetAssignments(userID, wmSourceIDs);
            }

            return assignments;
        }
        public static AssignmentDetailsCollection GetAssignments(int[] sourceIDs)
        {
            AssignmentDetailsCollection assignments = new AssignmentDetailsCollection();
            DataSet dsResults = null;
            FinalBuild.DataAccess objADO = Domain.GetADOInstance();
            System.Data.SqlClient.SqlParameter[] arrParameters;
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;
            DataRow[] filteredRows = null;
            string strStoredProcedure = "selAssignmentsByJobAndUser";

            // Assemble Parameters
            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", sourceIDs);
            //colParameters.Add(new SqlParameter("@UserID", userID));
            arrParameters = (SqlParameter[])colParameters.ToArray(typeof(SqlParameter));

            dsResults = objADO.GetDataSet(strStoredProcedure, objParameter, arrParameters);
            dsResults.Tables[0].TableName = "Assignments";
            dsResults.Tables[1].TableName = "Assignees";
            dsResults.Tables[2].TableName = "Appointments";

            foreach (DataRow drAssignment in dsResults.Tables["Assignments"].Rows)
            {
                assignments.Add(new AssignmentDetails());
                assignments[assignments.Count - 1].ID = int.Parse(drAssignment["WMSourceID"].ToString());
                assignments[assignments.Count - 1].SourceSystem = (eWMSourceSystem)Enum.Parse(typeof(eWMSourceSystem), drAssignment["WMSourceSystem"].ToString());
                if (!drAssignment["DueDate"].Equals(DBNull.Value))
                {
                    assignments[assignments.Count - 1].DueDate = (DateTime)drAssignment["DueDate"];
                }
                assignments[assignments.Count - 1].Status = (eJobStatus)Enum.Parse(typeof(eJobStatus), drAssignment["JobStatus"].ToString());

                filteredRows = dsResults.Tables["Assignees"].Select(string.Format("WMSourceID='{0}'", assignments[assignments.Count - 1].ID));

                if (filteredRows.Length > 0)
                {
                    int userIDJobInstanceNumber = 0;
                    assignments[assignments.Count - 1].Workers = new WorkerCollection();
                    for (int assigneeIndex = 0; assigneeIndex < filteredRows.Length; assigneeIndex++)
                    {
                        assignments[assignments.Count - 1].Workers.Add(new Worker());
                        assignments[assignments.Count - 1].Workers[assigneeIndex].LoginName = filteredRows[assigneeIndex]["UserID"].ToString();
                        if (!filteredRows[assigneeIndex]["EmpSurname"].Equals(DBNull.Value))
                        {
                            assignments[assignments.Count - 1].Workers[assigneeIndex].Surname = filteredRows[assigneeIndex]["EmpSurname"].ToString();
                        }
                        if (!filteredRows[assigneeIndex]["EmpForenames"].Equals(DBNull.Value))
                        {
                            assignments[assignments.Count - 1].Workers[assigneeIndex].Forenames = filteredRows[assigneeIndex]["EmpForenames"].ToString();
                        }
                        if (!filteredRows[assigneeIndex]["EmpNo"].Equals(DBNull.Value))
                        {
                            assignments[assignments.Count - 1].Workers[assigneeIndex].EmpNo = filteredRows[assigneeIndex]["EmpNo"].ToString();
                        }
                        //if (filteredRows[assigneeIndex]["UserID"].ToString().ToUpper() == userID.ToUpper())
                        //{
                            userIDJobInstanceNumber = int.Parse(filteredRows[assigneeIndex]["JobInstanceNumber"].ToString());
                        //}
                    }
                    assignments[assignments.Count - 1].InstanceNumber = userIDJobInstanceNumber;
                }

                filteredRows = dsResults.Tables["Appointments"].Select(string.Format("WMSourceID={0}", assignments[assignments.Count - 1].ID));
                if (filteredRows.Length > 0)
                {
                    foreach (DataRow drSerializedInstance in filteredRows)
                    {
                        if (!drSerializedInstance["Appointment"].Equals(DBNull.Value))
                        {
                            System.Xml.XmlDocument objDOM = new System.Xml.XmlDocument();
                            objDOM.LoadXml(drSerializedInstance["Appointment"].ToString()); //.Replace(" xmlns=\"http://FinalBuild.co.uk/BusinessObjects.WorkManagement\"", string.Empty));
                            assignments[assignments.Count - 1].Appointment = (Appointment)BusinessObjects.Base.Deserialize(typeof(Appointment), objDOM);
                        }
                    }
                }
            }

            return assignments;
        }
        public static bool RemoveAssignees(int wmSourceID, eWMSourceSystem sourceSystem, string[] userList)
        {
            DataAccess objADO = new DataAccess();
            ArrayList colParameters = new ArrayList();
            string strStoredProcedure = "delJobAssignees";
            int intRowsAffected = 0;

            colParameters.Add(new SqlParameter("@WMSourceID", wmSourceID));
            colParameters.Add(new SqlParameter("@WMSourceSystem", sourceSystem.ToString()));
            if (userList != null)
            {
                DataAccess.ArrayListParameter objParameter = new DataAccess.ArrayListParameter("UserList", userList);
                intRowsAffected = objADO.ExecuteSQL(strStoredProcedure, objParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            else
            {
                intRowsAffected = objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            objADO = null;

            return (intRowsAffected > 0);
        }
        public static int UpdatePostScheduling(int wmSourceID, eWMSourceSystem sourceSystem, DateTime dateScheduled, string[] assignedEngineers, DateTime assignmentStartDate,
                                                        int jobInstanceNumber, bool updateDateChangeDetected)
        {
            DataAccess objADO = new DataAccess();
            ArrayList colParameters = new ArrayList();
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "updJobPostClickScheduling";
            int intRowsAffected = 0;

            colParameters.Add(new SqlParameter("@WMSourceID", wmSourceID));
            colParameters.Add(new SqlParameter("@WMSourceSystem", sourceSystem.ToString()));
            colParameters.Add(new SqlParameter("@ClickDateScheduled", dateScheduled));
            if (assignedEngineers != null && assignedEngineers.Length > 0)
            {
                objParameter = new DataAccess.ArrayListParameter("JobAssignees", assignedEngineers);
            }
            if (assignmentStartDate != null && assignmentStartDate != DateTime.MinValue)
            {
                colParameters.Add(new SqlParameter("@TargetStartDate", assignmentStartDate));
            }
            colParameters.Add(new SqlParameter("@JobInstanceNumber", jobInstanceNumber));
            if (updateDateChangeDetected)
            {
                colParameters.Add(new SqlParameter("@UpdateDateChangeDetected", true));
            }

            //Updated : AP :  ExecuteSQL method used below is dependent on having Engineers or not
            if (objParameter != null)
            {
                intRowsAffected = objADO.ExecuteSQL(strStoredProcedure, objParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }
            else
            {
                intRowsAffected = objADO.ExecuteSQL(strStoredProcedure, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter)));
            }

            objADO = null;

            return intRowsAffected;
        }
        public static System.Collections.Generic.SortedList<int, eJobStatus> GetStatusesOfJobs(int[] jobIDs)
        {
            System.Collections.Generic.SortedList<int, eJobStatus> jobStatusesList = new System.Collections.Generic.SortedList<int, eJobStatus>();
            DataTable dtResults = null;
            DataAccess objADO = new DataAccess();
            ArrayList colParameters = new ArrayList();
            System.Data.SqlClient.SqlParameter[] arrParameters = null;
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "selStatusesForWMSourceIDs";

            objADO = Domain.GetADOInstance();

            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", jobIDs);
            dtResults = objADO.GetDataSet(strStoredProcedure, objParameter, arrParameters).Tables[0];
            objADO = null;

            if (dtResults.Rows.Count > 0)
            {
                foreach (DataRow drJobStatusInfo in dtResults.Rows)
                {
                    jobStatusesList.Add(int.Parse(drJobStatusInfo["WMSourceID"].ToString()), (eJobStatus)Enum.Parse(typeof(eJobStatus),drJobStatusInfo["JobStatus"].ToString()));
                }
            }

            return jobStatusesList;
        }
        public static Appointment GetAppointment(int jobID, int jobInstanceNumber)
        {
            Appointment deserializedAppointment = null;
            System.Xml.XmlDocument objDOM = null;

            DataTable dtResults = null;
            FinalBuild.DataAccess objADO = Domain.GetADOInstance();
            System.Collections.ArrayList colParameters = new System.Collections.ArrayList();
            DataAccess.ArrayListParameter objParameter = null;
            string strStoredProcedure = "selAppointmentsMatchingCriteria";

            // Assemble Parameters
            objParameter = new DataAccess.ArrayListParameter("WMSourceIDs", new int[]{jobID});
            colParameters.Add(new SqlParameter("@JobInstanceNumber", jobInstanceNumber));

            dtResults = objADO.GetDataSet(strStoredProcedure, objParameter, (SqlParameter[])colParameters.ToArray(typeof(SqlParameter))).Tables[0];
            if (dtResults.Rows.Count > 0)
            {
                foreach (DataRow drSerializedAppointment in dtResults.Rows)
                {
                    if (!drSerializedAppointment["Appointment"].Equals(DBNull.Value))
                    {
                        objDOM = new System.Xml.XmlDocument();
                        objDOM.LoadXml(drSerializedAppointment["Appointment"].ToString());
                        deserializedAppointment = (Appointment)BusinessObjects.Base.Deserialize(typeof(Appointment), objDOM);
                    }

                    break; // This routine only interested in first (current) Appointment value
                }
            }

            return deserializedAppointment;
        }