/// <summary>
        /// Function to save release details.
        /// </summary>
        /// <param name="releaseCalendar">Release information</param>
        /// <param name="artifacts">List of artifacts</param>
        /// <param name="subprojects">List of sub project</param>
        /// <param name="developerId">Developer id</param>
        /// <param name="oldProjectId">The old project identifier.</param>
        public void InsertOrUpdate(ReleaseCalendar releaseCalendar, IList<ArtifactFillListItem> artifacts, IList<ProjectFillItem> subprojects, int developerId, int oldProjectId)
        {
            if (releaseCalendar == null)
            {
                throw new ArgumentNullException(ReleaseCalendarConst);
            }

            releaseCalendar.ModifiedByDeveloperID = developerId;

            if (artifacts != null)
            {
                releaseCalendar.ProjectArtifacts = artifacts.RetrieveAddedOrDeleted().Select(item => item.MapToReleaseArtifact(releaseCalendar)).ToList();
                if (releaseCalendar.ReleaseCalendarID != default(int) && releaseCalendar.ProjectID != oldProjectId)
                {
                    releaseCalendar.ProjectArtifacts = (from actualArtifact in this.projectArtifactService.RetrieveProjectArtifactByReleaseCalendarId(releaseCalendar.ReleaseCalendarID)
                                                        from artifact in artifacts.RetrieveModified()
                                                        where actualArtifact.ProjectArtifactID == artifact.ProjectArtifactID
                                                        select actualArtifact.RetrieveUpdatedArtifact(releaseCalendar)).Concat(releaseCalendar.ProjectArtifacts).ToList();
                }
            }

            if (subprojects != null)
            {
                subprojects = subprojects.Where(item => (item.LinkId <= 0 && item.IsSelected)
                    || (item.LinkId > 0 && !item.IsSelected)).ToList();
                releaseCalendar.ReleaseSubProjects = subprojects.Select(item => item.MapToReleaseSubproject(releaseCalendar)).ToList();
            }

            this.releaseRepository.InsertOrUpdate(releaseCalendar);
            this.unitOfWork.Save();
            if (releaseCalendar.ProjectID == oldProjectId)
            {
                this.UpdateDueDates(releaseCalendar, artifacts, developerId);
            }
        }
 /// <summary>
 /// Updates the due dates.
 /// </summary>
 /// <param name="releaseCalendar">The release calendar.</param>
 /// <param name="artifacts">The artifacts.</param>
 /// <param name="developerId">The developer identifier.</param>
 private void UpdateDueDates(ReleaseCalendar releaseCalendar, IList<ArtifactFillListItem> artifacts, int developerId)
 {
     var modifiedIds = artifacts.Except(artifacts.RetrieveAddedOrDeleted()).Where(a => a.IsSelected.Value).Select(a => a.ProjectArtifactID.Value).ToList();
     this.projectArtifactService.UpdateDueDate(modifiedIds, releaseCalendar.StartDate.Date, developerId);
 }
        /// <summary>
        /// Saves the project.
        /// </summary>
        /// <param name="project">The project.</param>
        /// <param name="artifacts">The artifact</param>
        /// <param name="developerId">The developerId.</param>
        public void InsertOrUpdate(Project project, IList<ArtifactFillListItem> artifacts, int developerId)
        {
            if (project == null)
            {
                throw new ArgumentNullException(ProjectConst);
            }

            project.ModifiedByDeveloperID = developerId;
            project.Name = !string.IsNullOrEmpty(project.Name) ? project.Name.Trim() : project.Name;

            if (artifacts != null)
            {
                project.ProjectArtifacts = artifacts.RetrieveAddedOrDeleted().Select(item => item.MapToProjectArtifact(project)).ToList();
            }

            this.projectRepository.InsertOrUpdate(project);
            this.unitOfWork.Save();
        }