/// <summary>
        /// Save
        /// </summary>
        /// <param name="countryId">countryId</param>
        /// <param name="provinceId">provinceId</param>
        /// <param name="countyId">countyId</param>
        /// <param name="cityId">cityId</param>
        /// <param name="projectId">projectId</param>
        /// <param name="assetId">assetId</param>
        /// <param name="companyId">companyId</param>
        /// <param name="inProject">inProject</param>
        /// <returns>WorkID</returns>
        public int Save(Int64? countryId, Int64? provinceId, Int64? countyId, Int64? cityId, int projectId, int assetId, int companyId, bool inProject)
        {
            ManholeRehabilitationTDS manholeRehabilitationChanges = (ManholeRehabilitationTDS)Data.GetChanges();
            int workId = 0;

            if (manholeRehabilitationChanges.WorkDetails.Rows.Count > 0)
            {
                ManholeRehabilitationWorkDetailsGateway manholeRehabilitationWorkDetailsGateway = new ManholeRehabilitationWorkDetailsGateway(manholeRehabilitationChanges);

                // Update manhole rehabilitation
                foreach (ManholeRehabilitationTDS.WorkDetailsRow row in (ManholeRehabilitationTDS.WorkDetailsDataTable)manholeRehabilitationChanges.WorkDetails)
                {
                    // Unchanged values
                    workId = row.WorkID;

                    WorkManholeRehabilitationGateway workManholeRehabilitationGateway = new WorkManholeRehabilitationGateway();
                    workManholeRehabilitationGateway.LoadByWorkId(workId, companyId);

                    if (workManholeRehabilitationGateway.Table.Rows.Count > 0)
                    {
                        // Update Information
                        // Original values
                        // ... work values
                        DateTime? originalPreppedDate = manholeRehabilitationWorkDetailsGateway.GetPreppedDateOriginal(workId);
                        DateTime? originalSprayedDate = manholeRehabilitationWorkDetailsGateway.GetSprayedDateOriginal(workId);

                        // ... Comments
                        string originalComments = manholeRehabilitationWorkDetailsGateway.GetCommentsOriginal(workId);

                        // New variables
                        DateTime? newPreppedDate = manholeRehabilitationWorkDetailsGateway.GetPreppedDate(workId);
                        DateTime? newSprayedDate = manholeRehabilitationWorkDetailsGateway.GetSprayedDate(workId);

                        // comments
                        string newComments = manholeRehabilitationWorkDetailsGateway.GetComments(workId);

                        // Update work
                        UpdateWork(countryId, provinceId, countyId, cityId, projectId, assetId, originalPreppedDate, originalSprayedDate, row.BatchID, originalComments, false, companyId, newPreppedDate, newSprayedDate, row.BatchID, newComments, false);
                    }
                    else
                    {
                        // Loading workId
                        WorkGateway workGateway = new WorkGateway();
                        workGateway.LoadByProjectIdAssetIdWorkType(projectId, assetId, "Manhole Rehabilitation", companyId);

                        if (workGateway.Table.Rows.Count == 0)
                        {
                            // New variables
                            DateTime? newPreppedDate = manholeRehabilitationWorkDetailsGateway.GetPreppedDate(workId);
                            DateTime? newSprayedDate = manholeRehabilitationWorkDetailsGateway.GetSprayedDate(workId);
                            int? newBatchId = manholeRehabilitationWorkDetailsGateway.GetBatchID(workId);
                            string newComments = manholeRehabilitationWorkDetailsGateway.GetComments(workId);

                            // InsertWork
                            Work work = new Work();

                            int? libraryCategories = null;
                            string history = "";

                            int newWorkId = work.InsertDirect(projectId, assetId, "Manhole Rehabilitation", libraryCategories, false, companyId, newComments, history);

                            // ... Insert manhole rehabilitation work
                            WorkManholeRehabilitation workManholeRehabilitation = new WorkManholeRehabilitation();
                            workManholeRehabilitation.InsertDirect(newWorkId, newPreppedDate, newSprayedDate, newBatchId, false, companyId);

                            workId = newWorkId;
                        }
                    }
                }
            }

            return workId;
        }
        // ////////////////////////////////////////////////////////////////////////
        // PRIVATE METHODS
        //
        /// <summary>
        /// UpdateWork
        /// </summary>
        /// <param name="countryId">countryId</param>
        /// <param name="provinceId">provinceId</param>
        /// <param name="countyId">countyId</param>
        /// <param name="cityId">cityId</param>
        /// <param name="projectId">projectId</param>
        /// <param name="assetId">assetId</param>
        /// <param name="originalPreppedDate">originalPreppedDate</param>
        /// <param name="originalSprayedDate">originalSprayedDate</param>
        /// <param name="originalBatchId">originalBatchId</param>        
        /// <param name="originalComments">originalComments</param>
        /// <param name="originalDeleted">originalDeleted</param>
        /// <param name="originalCompanyId">originalCompanyId</param>
        /// 
        /// <param name="newPreppedDate">newPreppedDate</param>
        /// <param name="newSprayedDate">newSprayedDate</param>
        /// <param name="newBatchId">newBatchId</param>        
        /// <param name="newComments">newComments</param>
        /// <param name="newDeleted">newDeleted</param>
        private void UpdateWork(Int64? countryId, Int64? provinceId, Int64? countyId, Int64? cityId, int projectId, int assetId, DateTime? originalPreppedDate, DateTime? originalSprayedDate, int originalBatchId, string originalComments, bool originalDeleted, int originalCompanyId, DateTime? newPreppedDate, DateTime? newSprayedDate, int newBatchId, string newComments, bool newDeleted)
        {
            int newWorkId = 0;

            // Loading workId
            WorkGateway workGateway = new WorkGateway();
            workGateway.LoadByProjectIdAssetIdWorkType(projectId, assetId, "Manhole Rehabilitation", originalCompanyId);

            if (workGateway.Table.Rows.Count > 0)
            {
                newWorkId = workGateway.GetWorkId(assetId, "Manhole Rehabilitation", projectId);

                int? libraryCategoriesId = workGateway.GetLibraryCategoriesId(newWorkId);
                string history = workGateway.GetHistory(newWorkId);

                // Updating work
                Work work = new Work();
                work.UpdateDirect(newWorkId, projectId, assetId, "Manhole Rehabilitation", libraryCategoriesId, originalDeleted, originalCompanyId, originalComments, history, newWorkId, projectId, assetId, "Manhole Rehabilitation", libraryCategoriesId, originalDeleted, originalCompanyId, newComments, history);

                // Update manhole rehabilitation work
                WorkManholeRehabilitation workManholeRehabilitation = new WorkManholeRehabilitation();
                workManholeRehabilitation.UpdateDirect(newWorkId, originalPreppedDate, originalSprayedDate, originalBatchId, originalDeleted, originalCompanyId, newWorkId, newPreppedDate, newSprayedDate, newBatchId, newDeleted, originalCompanyId);
            }
        }
 /// <summary>
 /// DeleteDirect
 /// </summary>
 /// <param name="workId">workId</param>
 /// <param name="companyId">companyId</param>
 public void DeleteDirect(int workId, int companyId)
 {
     // Delete work
     WorkManholeRehabilitation workManholeRehabilitation = new WorkManholeRehabilitation(null);
     workManholeRehabilitation.DeleteDirect(workId, companyId);
 }
        /// <summary>
        /// SaveMHRehabWork
        /// </summary>
        /// <param name="projectId">projectId</param>
        /// <param name="mh_assetId">mh_assetId</param>
        /// <param name="companyId">companyId</param>
        private void SaveMHRehabWork(int projectId, int mh_assetId, int companyId)
        {
            MrBatchVerificationGateway mrBatchVerificationForLastBatch = new MrBatchVerificationGateway();
            mrBatchVerificationForLastBatch.LoadLastBatch(companyId);
            int? batchId = null;

            if (mrBatchVerificationForLastBatch.Table.Rows.Count > 0)
            {
                WorkManholeRehabilitationBatchGateway workManholeRehabilitationBatchGateway = new WorkManholeRehabilitationBatchGateway();
                batchId = workManholeRehabilitationBatchGateway.GetLastId(companyId);
            }

            WorkManholeRehabilitation workManholeRehabilitation = new WorkManholeRehabilitation(null);
            workManholeRehabilitation.InsertDirectEmptyWorks(projectId, mh_assetId, null, null, batchId, false, companyId);
        }