/// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> /// <exception cref="System.Exception">project not found</exception> /// <exception cref="System.ApplicationException">Permission denied for this project </exception> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString["projectid"] != null) { ProjectID = Convert.ToInt32(Request.QueryString["projectid"].ToString()); ucProjectEvents.ProjectID = ProjectID; } StageBitz.Data.Project project = (from p in DataContext.Projects where p.ProjectId == ProjectID select p).FirstOrDefault(); if (project == null) { throw new Exception("project not found"); } if (!Support.CanAccessProject(project)) { if (GetBL <ProjectBL>().IsProjectClosed(project.ProjectId)) { StageBitzException.ThrowException(new StageBitzException(ExceptionOrigin.ProjectClose, project.ProjectId, "This Project Is Closed.")); } throw new ApplicationException("Permission denied for this project "); } this.CompanyId = project.CompanyId; projectWarningPopup.ProjectId = ProjectID; warningDisplay.ProjectID = ProjectID; warningDisplay.LoadData(); //Set last updated date for concurrency handling OriginalLastUpdatedDate = project.LastUpdatedDate.Value; btnCancel.PostBackUrl = string.Format("~/Project/ProjectDashboard.aspx?projectid={0}", ProjectID); DisplayTitle = "Manage Schedule";//string.Format("{0}'s Dashboard", Support.TruncateString(project.ProjectName, 32)); bool isReadOnlyRightsForProject = Support.IsReadOnlyRightsForProject(ProjectID); btnCancel.Visible = !isReadOnlyRightsForProject; #region SET LINKS lnkCompanyInventory.HRef = string.Format("~/Inventory/CompanyInventory.aspx?companyid={0}&relatedtable={1}&relatedid={2}", project.CompanyId, (int)BookingTypes.Project, ProjectID); lnkBookings.HRef = string.Format("~/Project/ProjectBookingDetails.aspx?projectid={0}", ProjectID); linkTaskManager.HRef = string.Format("~/ItemBrief/TaskManager.aspx?projectid={0}", ProjectID); reportList.ShowReportLinks(string.Format("~/ItemBrief/ItemisedPurchaseReport.aspx?projectid={0}", ProjectID), string.Format("~/ItemBrief/BudgetSummaryReport.aspx?projectid={0}", ProjectID), ProjectID); projectUpdatesLink.ProjectID = ProjectID; projectUpdatesLink.LoadData(); #endregion SET LINKS LoadBreadCrumbs(project); } ucProjectEvents.SetEventsGridLength(900);//to fix the events grid issue in chrome set the lengh of the grid manually. }
/// <summary> /// Loads the bread crumbs. /// </summary> /// <param name="Project">The project.</param> private void LoadBreadCrumbs(StageBitz.Data.Project Project) { BreadCrumbs bc = GetBreadCrumbsControl(); string companyUrl = Support.IsCompanyAdministrator(Project.Company.CompanyId) ? string.Format("~/Company/CompanyDashboard.aspx?CompanyId={0}", Project.Company.CompanyId) : null; bc.AddLink(Project.Company.CompanyName, companyUrl); bc.AddLink(Project.ProjectName, string.Format("~/Project/ProjectDashboard.aspx?projectid={0}", Project.ProjectId)); bc.AddLink(DisplayTitle, null); bc.LoadControl(); }
/// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> /// <exception cref="System.Exception">project not found</exception> /// <exception cref="System.ApplicationException"> /// Permission denied for this project /// or /// Invalid request. /// </exception> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString["projectid"] != null) { ProjectID = Convert.ToInt32(Request.QueryString["projectid"].ToString()); projectWarningPopup.ProjectId = ProjectID; StageBitz.Data.Project project = (from p in DataContext.Projects where p.ProjectId == ProjectID && p.IsActive == true select p).FirstOrDefault(); if (project == null) { throw new Exception("project not found"); } this.CompanyId = project.CompanyId; DisplayTitle = string.Format("{0}'s Updates Report", Support.TruncateString(project.ProjectName, 32)); if (!Support.CanAccessProject(project)) { if (GetBL <ProjectBL>().IsProjectClosed(project.ProjectId)) { StageBitzException.ThrowException(new StageBitzException(ExceptionOrigin.ProjectClose, project.ProjectId, "This Project Is Closed.")); } throw new ApplicationException("Permission denied for this project "); } warningDisplay.ProjectID = ProjectID; warningDisplay.LoadData(); LoadConfigurationSettings(); #region SET LINKS lnkCompanyInventory.HRef = string.Format("~/Inventory/CompanyInventory.aspx?companyid={0}&relatedtable={1}&relatedid={2}", project.CompanyId, (int)BookingTypes.Project, ProjectID); lnkBookings.HRef = string.Format("~/Project/ProjectBookingDetails.aspx?projectid={0}", ProjectID); linkTaskManager.HRef = ResolveUrl(string.Format("~/ItemBrief/TaskManager.aspx?projectid={0}", ProjectID)); reportList.ShowReportLinks(string.Format("~/ItemBrief/ItemisedPurchaseReport.aspx?projectid={0}", ProjectID), string.Format("~/ItemBrief/BudgetSummaryReport.aspx?projectid={0}", ProjectID), ProjectID); projectUpdatesLink.ProjectID = ProjectID; projectUpdatesLink.LoadData(false); #endregion SET LINKS LoadBreadCrumbs(project); } else //UNCOMMENT this { throw new ApplicationException("Invalid request."); } } }
/// <summary> /// Loads the bread crumbs. /// </summary> /// <param name="project">The project.</param> private void LoadBreadCrumbs(StageBitz.Data.Project project) { BreadCrumbs bc = GetBreadCrumbsControl(); StageBitz.Data.Company company = project.Company; string companyUrl = Support.IsCompanyAdministrator(company.CompanyId) ? string.Format("~/Company/CompanyDashboard.aspx?CompanyId={0}", company.CompanyId) : null; bc.AddLink(company.CompanyName, companyUrl); bc.AddLink(project.ProjectName, string.Format("~/Project/ProjectDashboard.aspx?projectid={0}", project.ProjectId)); bc.AddLink("Updates Report", null); bc.LoadControl(); }
/// <summary> /// Loads the bread crumbs. /// </summary> private void LoadBreadCrumbs() { BreadCrumbs bc = GetBreadCrumbsControl(); StageBitz.Data.Project project = DataContext.Projects.Where(p => p.ProjectId == ProjectId).FirstOrDefault(); StageBitz.Data.Company company = project.Company; string companyUrl = Support.IsCompanyAdministrator(company.CompanyId) ? string.Format("~/Company/CompanyDashboard.aspx?CompanyId={0}", company.CompanyId) : null; bc.AddLink(company.CompanyName, companyUrl); bc.AddLink(project.ProjectName, string.Format("~/Project/ProjectDashboard.aspx?ProjectId={0}", project.ProjectId)); bc.AddLink(DisplayTitle, null); bc.LoadControl(); }
/// <summary> /// Loads the bread crumbs. /// </summary> private void LoadBreadCrumbs() { BreadCrumbs bc = GetBreadCrumbsControl(); StageBitz.Data.Project project = DataContext.Projects.Where(p => p.ProjectId == ProjectId).FirstOrDefault(); int companyId = project.Company.CompanyId; if (Support.IsCompanyAdministrator(companyId)) { bc.AddLink(project.Company.CompanyName, string.Format("~/Company/CompanyDashboard.aspx?companyid={0}", companyId)); } else { bc.AddLink(project.Company.CompanyName, string.Empty); } bc.AddLink(project.ProjectName, string.Format("~/Project/ProjectDashboard.aspx?ProjectId={0}", ProjectId)); bc.AddLink(DisplayTitle, null); bc.LoadControl(); }
/// <summary> /// Loads the data. /// </summary> public void LoadData() { StageBitz.Data.Project project = DataContext.Projects.Where(p => p.ProjectId == ProjectID).FirstOrDefault(); bool paymentsSpecified = (FinanceSupport.GetCreditCardToken("Company", project.CompanyId) != null); ProjectStatusHandler.ProjectWarningInfo warningInfo = ProjectStatusHandler.GetProjectWarningStatus(project.ProjectStatusCodeId, project.ProjectTypeCodeId == Support.GetCodeByValue("ProjectType", "FREETRIALOPTIN").CodeId, project.ExpirationDate); StageBitz.Data.User companyAdmin = this.GetBL <CompanyBL>().GetCompanyPrimaryAdministrator(project.CompanyId); ProjectName = Support.TruncateString(project.ProjectName, 30); RemainingDays = string.Format("{0} day{1}", warningInfo.DaysToExpiration < 0 ? 0 : warningInfo.DaysToExpiration, warningInfo.DaysToExpiration == 1 ? string.Empty : "s"); CompanyAdminName = Support.TruncateString((companyAdmin.FirstName + " " + companyAdmin.LastName).Trim(), 30); CompanyAdminEmail = companyAdmin.Email1; PaymentFailedDate = null; CompanyFinancialUrl = ResolveUrl(string.Format("~/Company/CompanyFinancialDetails.aspx?companyid={0}", project.CompanyId)); if (warningInfo.WarningStatus == ProjectStatusHandler.ProjectWarningStatus.NoWarning) { noticesMultiView.Visible = false; return; } else { noticesMultiView.Visible = true; } #region Determine User Permission Type ProjectPermission userType = ProjectPermission.Staff; if (Support.IsCompanyAdministrator(project.CompanyId)) { userType = ProjectPermission.CompanyAdministrator; } else if (Support.IsProjectAdministrator(ProjectID)) { userType = ProjectPermission.ProjectAdministrator; } else { userType = ProjectPermission.Staff; } #endregion Determine User Permission Type switch (warningInfo.WarningStatus) { case ProjectStatusHandler.ProjectWarningStatus.FreeTrialGrace: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.FreeTrialGraceCompanyAdmin; } break; case ProjectStatusHandler.ProjectWarningStatus.GracePeriod: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.GracePeriodCompanyAdmin; ucCompanyPaymentFailedWarningGracePeriodCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningGracePeriodCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.CompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailedGracePeriod); } else if (userType == ProjectPermission.ProjectAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.GracePeriodProjectAdmin; ucCompanyPaymentFailedWarningGracePeriodNonCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningGracePeriodNonCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.NonCompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailedGracePeriod); } PaymentFailedDate = project.ExpirationDate.Value.AddDays(-7); break; case ProjectStatusHandler.ProjectWarningStatus.PaymentFailed: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.PaymentFailedCompanyAdmin; ucCompanyPaymentFailedWarningPaymentFailedCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningPaymentFailedCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.CompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailed); } else if (userType == ProjectPermission.ProjectAdministrator || userType == ProjectPermission.Staff) { noticesMultiView.ActiveViewIndex = (int)NoticeType.PaymentFailedProjectStaff; ucCompanyPaymentFailedWarningPaymentFailedNonCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningPaymentFailedNonCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.NonCompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailed); } break; case ProjectStatusHandler.ProjectWarningStatus.Suspended: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.SuspendedCompanyAdmin; } else if (userType == ProjectPermission.ProjectAdministrator || userType == ProjectPermission.Staff) { noticesMultiView.ActiveViewIndex = (int)NoticeType.SuspendedProjectStaff; } break; case ProjectStatusHandler.ProjectWarningStatus.Closed: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.ClosedProjectCompanyAdmin; } break; } //If the project's payment has failed, calculate the number of days the payment is due. if (PaymentFailedDate != null) { int paymentOverdueDays = (int)(Today - PaymentFailedDate.Value).TotalDays; PaymentOverdueDays = string.Format("{0} day{1}", paymentOverdueDays, paymentOverdueDays == 1 ? string.Empty : "s"); } upnlProjectWarningDisplay.Update(); }
/// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> /// <exception cref="System.ApplicationException"> /// Item type not found /// or /// Project not found /// or /// Permission denied for this project /// </exception> /// <exception cref="System.Exception">Item Type not found</exception> protected void Page_Load(object sender, EventArgs e) { projectItemTypes.ProjectID = ProjectId; if (!IsPostBack) { LoadItemBriefSorting(); StageBitz.Data.Project project = GetBL <ProjectBL>().GetProject(ProjectId); #region concurrentScenarios projectWarningPopup.ProjectId = ProjectId; if (isItemRmoved()) { throw new ApplicationException("Item type not found"); } #endregion concurrentScenarios #region Check access security if (project == null) { throw new ApplicationException("Project not found"); } if (!Support.CanAccessProject(project)) { if (GetBL <ProjectBL>().IsProjectClosed(project.ProjectId)) { StageBitzException.ThrowException(new StageBitzException(ExceptionOrigin.ProjectClose, project.ProjectId, "This Project Is Closed.")); } throw new ApplicationException("Permission denied for this project "); } //Check the validity of the ItemType if (Utils.GetItemTypeById(ItemTypeId) == null) { throw new Exception("Item Type not found"); } #endregion Check access security this.CompanyId = project.CompanyId; warningDisplay.ProjectID = ProjectId; warningDisplay.LoadData(); //Set the page read only status if the user is project "Observer" IsReadOnly = Support.IsReadOnlyRightsForProject(ProjectId); pnlAddItem.Visible = !IsReadOnly; displaySettings.Module = ListViewDisplaySettings.ViewSettingModule.ProjectItemBriefList; displaySettings.LoadControl(); txtName.Focus(); #region SET LINKS lnkCompanyInventory.HRef = string.Format("~/Inventory/CompanyInventory.aspx?companyid={0}&relatedtable={1}&relatedid={2}&ItemTypeId={3}", project.CompanyId, (int)BookingTypes.Project, ProjectId, ItemTypeId); lnkBookings.HRef = string.Format("~/Project/ProjectBookingDetails.aspx?projectid={0}", ProjectId); hyperLinkTaskManager.NavigateUrl = ResolveUrl(string.Format("~/ItemBrief/TaskManager.aspx?projectid={0}&ItemTypeId={1}", ProjectId, ItemTypeId)); reportList.ShowReportLinks(string.Format("~/ItemBrief/ItemisedPurchaseReport.aspx?projectid={0}&ItemTypeId={1}", ProjectId, ItemTypeId), string.Format("~/ItemBrief/BudgetSummaryReport.aspx?projectid={0}&ItemTypeId={1}", ProjectId, ItemTypeId), ProjectId); projectUpdatesLink.ProjectID = ProjectId; projectUpdatesLink.LoadData(); #endregion SET LINKS var itemType = Utils.GetItemTypeById(ItemTypeId); string searchDefaultText = string.Concat("Find ", itemType.Name, " Briefs..."); wmeFindName.WatermarkText = searchDefaultText; DisplayTitle = string.Format("{0} Brief List", string.Concat(Utils.GetItemTypeById(ItemTypeId).Name)); LoadBreadCrumbs(project); ImportbulkItemsControl.ProjectID = ProjectId; ImportbulkItemsControl.ItemTypeId = ItemTypeId; ImportbulkItemsControl.IsReadOnly = IsReadOnly; //Security - Hide editing deleting for Observers if (IsReadOnly) { foreach (GridColumn col in gvItemList.MasterTableView.RenderColumns) { if (col.UniqueName == "EditCommandColumn") { col.Visible = false; } } } } projectItemTypes.InformParentToReload += delegate() { //Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri); ReloadByItemType(); }; ImportbulkItemsControl.InformItemListToLoad += delegate()//Subscribe to the Informparent to get updated { displaySettings.LoadControl(); }; }
/// <summary> /// To be called by the daily agent /// </summary> public static void UpdateProjectExpirations(DateTime dateToConsider, StageBitzDB dataContext) { //Get project status code ids int freeTrialCodeId = Utils.GetCodeByValue("ProjectStatus", "FREETRIAL").CodeId; int activeCodeId = Utils.GetCodeByValue("ProjectStatus", "ACTIVE").CodeId; int gracePeriodCodeId = Utils.GetCodeByValue("ProjectStatus", "GRACEPERIOD").CodeId; int paymentFailedCodeId = Utils.GetCodeByValue("ProjectStatus", "PAYMENTFAILED").CodeId; int suspendedCodeId = Utils.GetCodeByValue("ProjectStatus", "SUSPENDED").CodeId; int freeTrialOptInCodeId = Utils.GetCodeByValue("ProjectType", "FREETRIALOPTIN").CodeId; int freeTrialTypeCodeId = Utils.GetCodeByValue("ProjectType", "FREETRIAL").CodeId; FinanceBL financeBL = new FinanceBL(dataContext); CompanyBL companyBL = new CompanyBL(dataContext); int companyPrimaryAdminCodeID = Utils.GetCodeByValue("CompanyUserTypeCode", "ADMIN").CodeId; int freeTrialProjectTypeCodeId = Utils.GetCodeByValue("ProjectType", "FREETRIAL").CodeId; string userWebUrl = Utils.GetSystemValue("SBUserWebURL"); string supportEmail = Utils.GetSystemValue("FeedbackEmail"); #region Free Trial ending pre-notice email //Get the free trial projects that are about to expire in 7 days, and notify them via email var freeTrialProjects = from p in dataContext.Projects where (p.ProjectStatusCodeId == freeTrialCodeId && p.ProjectTypeCodeId == freeTrialProjectTypeCodeId) && p.ExpirationDate != null select new { Project = p, PaymentsSpecified = (dataContext.CreditCardTokens .Where(tk => tk.RelatedTableName == "Company" && tk.RelatedId == p.CompanyId && tk.IsActive == true) .FirstOrDefault() != null) }; foreach (var projectInfo in freeTrialProjects) { StageBitz.Data.Project p = projectInfo.Project; int datediff = (p.ExpirationDate.Value.Date - dateToConsider).Days; if (datediff <= 7 && datediff >= 0) { string freeTrialGraceEmailType = "PROJECTFREETRIALGRACE"; //Check if the free trial expiration pre-notice has already been sent Email preNoticeEmail = dataContext.Emails.Where(em => em.EmailType == freeTrialGraceEmailType && em.RelatedId == p.ProjectId).FirstOrDefault(); if (preNoticeEmail == null) { Data.User companyPrimaryAdmin = //p.Company.CompanyUsers.Where(cu => cu.IsActive == true && cu.CompanyUserTypeCodeId == companyPrimaryAdminCodeID).FirstOrDefault().User; (from cu in p.Company.CompanyUsers join cur in dataContext.CompanyUserRoles on cu.CompanyUserId equals cur.CompanyUserId where cu.IsActive && cur.CompanyUserTypeCodeId == companyPrimaryAdminCodeID && cur.IsActive select cu).FirstOrDefault().User; string companyBillingUrl = string.Format("{0}/Company/CompanyFinancialDetails.aspx?companyid={1}", userWebUrl, p.CompanyId); string createProjectUrl = string.Format("{0}/Project/AddNewProject.aspx?companyid={1}", userWebUrl, p.CompanyId); EmailSender.SendProjectExpirationNoticeToCompanyAdmin(freeTrialGraceEmailType, p.ProjectId, companyPrimaryAdmin.Email1, companyPrimaryAdmin.FirstName, p.ProjectName, Utils.GetLongDateHtmlString(p.ExpirationDate.Value), companyBillingUrl, createProjectUrl, supportEmail); } } } #endregion #region Project Status Updates // this excute after project ExpirationDate is exceded. eg:- if the agent is down for 7 days, project status should be suspended. var projects = from p in dataContext.Projects where (p.ProjectStatusCodeId == freeTrialCodeId || p.ProjectStatusCodeId == gracePeriodCodeId || p.ProjectStatusCodeId == suspendedCodeId) && p.ExpirationDate != null && dateToConsider >= p.ExpirationDate select new { Project = p, PaymentsSpecified = (dataContext.CreditCardTokens .Where(tk => tk.RelatedTableName == "Company" && tk.RelatedId == p.CompanyId && tk.IsActive == true) .FirstOrDefault() != null) }; foreach (var projectInfo in projects) { StageBitz.Data.Project p = projectInfo.Project; Data.User companyPrimaryAdmin = // p.Company.CompanyUsers.Where(cu => cu.IsActive == true && cu.CompanyUserTypeCodeId == companyPrimaryAdminCodeID).FirstOrDefault().User; (from cu in p.Company.CompanyUsers join cur in dataContext.CompanyUserRoles on cu.CompanyUserId equals cur.CompanyUserId where cu.IsActive && cur.CompanyUserTypeCodeId == companyPrimaryAdminCodeID && cur.IsActive select cu).FirstOrDefault().User; string emailTemplateType = string.Empty; //Next expiration date is 7 days from current expiration date DateTime nextExpirationDate = p.ExpirationDate.Value.Date.AddDays(7); if (p.ProjectStatusCodeId == freeTrialCodeId) { //Get the current Company package to check. CompanyPaymentPackage companyPaymentPackage = financeBL.GetCurrentPaymentPackageFortheCompanyIncludingFreeTrial(p.CompanyId, dateToConsider); DiscountCodeUsage discountCodeUsage = financeBL.GetDiscountCodeUsageByDate(dateToConsider, p.CompanyId); //There are only two possibilities. Either user has given his permission or nothing has done. //Check whether user has given the approval to continue the Free trial project. if (p.ProjectTypeCodeId == freeTrialOptInCodeId) { // He has optin not to continue if (companyPaymentPackage == null) { p.ProjectStatusCodeId = suspendedCodeId; } // He has optin to continue, with zero project package else if ((companyPaymentPackage != null && Utils.GetSystemProjectPackageDetailByPaymentPackageTypeId(companyPaymentPackage.ProjectPaymentPackageTypeId).ProjectCount == 0) || (!companyPaymentPackage.PaymentMethodCodeId.HasValue && (discountCodeUsage == null || discountCodeUsage.DiscountCode.Discount != 100))) { p.ProjectStatusCodeId = suspendedCodeId; } else { p.ProjectStatusCodeId = activeCodeId; } } else { p.ProjectStatusCodeId = suspendedCodeId; emailTemplateType = "PROJECTFREETRIALSUSPENDED"; } p.ExpirationDate = null; p.LastUpdatedDate = Utils.Now; p.LastUpdatedByUserId = 0; } else if (p.ProjectStatusCodeId == gracePeriodCodeId) { p.ProjectStatusCodeId = paymentFailedCodeId; p.LastUpdatedDate = Utils.Now; p.LastUpdatedByUserId = 0; } else if (p.ProjectStatusCodeId == suspendedCodeId && (p.ProjectTypeCodeId == freeTrialOptInCodeId || p.ProjectTypeCodeId == freeTrialTypeCodeId)) { // if free trial project is manually suspended during free trial, set ExpirationDate to null at the end of free trial period. p.ExpirationDate = null; } //Send the email notice if required if (emailTemplateType != string.Empty) { string companyBillingUrl = string.Format("{0}/Company/CompanyFinancialDetails.aspx?companyid={1}", userWebUrl, p.CompanyId); string createProjectUrl = string.Format("{0}/Project/AddNewProject.aspx?companyid={1}", userWebUrl, p.CompanyId); string expirationDate = string.Empty; if (p.ExpirationDate != null) { expirationDate = Utils.GetLongDateHtmlString(p.ExpirationDate.Value); } string pricingPlanURL = string.Format("{0}/Company/CompanyPricingPlans.aspx?companyId={1}", userWebUrl, p.CompanyId); EmailSender.SendProjectExpirationNoticeToCompanyAdmin(emailTemplateType, p.ProjectId, companyPrimaryAdmin.Email1, companyPrimaryAdmin.FirstName, p.ProjectName, expirationDate, companyBillingUrl, createProjectUrl, supportEmail, pricingPlanURL); } } #endregion }
/// <summary> /// Handles the Click event of the btnDecline control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void btnDecline_Click(object sender, EventArgs e) { if (!PageBase.StopProcessing) { Invitation invitation = DataContext.Invitations.Where(inv => inv.InvitationId == InvitationId).FirstOrDefault(); invitation.InvitationStatusCodeId = Support.GetCodeIdByCodeValue("InvitationStatus", "REJECTED"); invitation.LastUpdatedByUserId = UserID; invitation.LastUpdatedDate = Now; DataContext.SaveChanges(); #region Send declined email notice Code invitationTypeCode = Support.GetCodeByCodeId(invitation.InvitationTypeCodeId); try { if (invitationTypeCode.Value == "PROJECTTEAM") { User invitedUser = DataContext.Users.Where(u => u.UserId == invitation.ToUserId).SingleOrDefault(); User invitee = DataContext.Users.Where(u => u.UserId == invitation.FromUserId).SingleOrDefault(); string invitedPersonName = (invitedUser.FirstName + " " + invitedUser.LastName).Trim(); string toPersonName = (invitee.FirstName + " " + invitee.LastName).Trim(); string toEmail = invitee.Email1; string role = invitation.ProjectRole; StageBitz.Data.Project project = DataContext.Projects.Where(p => p.ProjectId == invitation.RelatedId).SingleOrDefault(); string projectName = project.ProjectName; string companyName = DataContext.Companies.Where(c => c.CompanyId == project.CompanyId).SingleOrDefault().CompanyName; #region Notifications Notification nf = new Notification(); nf.ModuleTypeCodeId = Support.GetCodeIdByCodeValue("ModuleType", "PROJTEAM"); nf.OperationTypeCodeId = Support.GetCodeIdByCodeValue("OperationType", "DELETE"); nf.RelatedId = invitation.RelatedId; nf.ProjectId = invitation.RelatedId; nf.Message = string.Format("{0} declined the Project invitation.", Support.UserFullName); nf.CreatedByUserId = nf.LastUpdatedByUserId = UserID; nf.CreatedDate = nf.LastUpdatedDate = Now; DataContext.Notifications.AddObject(nf); DataContext.SaveChanges(); #endregion Notifications EmailSender.SendProjectTeamInvitationDeclinedNotice(toEmail, toPersonName, invitedPersonName, projectName, role, companyName); } else if (invitationTypeCode.Value == "COMPANYADMIN" || invitationTypeCode.Value == "INVENTORYTEAM") { int templateCodeId = 0; if (invitationTypeCode.Value == "COMPANYADMIN") { templateCodeId = Utils.GetCodeIdByCodeValue("EmailTemplateTypeCode", "COMPANYADMININV_DECLINED"); } else if (invitationTypeCode.Value == "INVENTORYTEAM") { templateCodeId = Utils.GetCodeIdByCodeValue("EmailTemplateTypeCode", "INVENTORYTEAMINV_DECLINED"); } User invitedUser = DataContext.Users.Where(u => u.UserId == invitation.ToUserId).SingleOrDefault(); User invitee = DataContext.Users.Where(u => u.UserId == invitation.FromUserId).SingleOrDefault(); string invitedPersonName = (invitedUser.FirstName + " " + invitedUser.LastName).Trim(); string toPersonName = (invitee.FirstName + " " + invitee.LastName).Trim(); string toEmail = invitee.Email1; string companyName = DataContext.Companies.Where(c => c.CompanyId == invitation.RelatedId).SingleOrDefault().CompanyName; EmailSender.SendCompanyAdminInvitationDeclinedNotice(toEmail, toPersonName, invitedPersonName, companyName, templateCodeId); } } catch { //Handle exceptions silently } #endregion Send declined email notice popupViewInvitation.HidePopup(); if (InvitationStatusChanged != null) { InvitationStatusChangedEventArgs args = new InvitationStatusChangedEventArgs(); args.Accepted = false; InvitationStatusChanged(this, args); } } }
/// <summary> /// Saves the project details. /// </summary> private void SaveProjectDetails() { bool isReadOnlyRightsForProject = Support.IsReadOnlyRightsForProject(ProjectID); if (txtName.Text.Trim() != string.Empty && ProjectName != txtName.Text.Trim() && !isReadOnlyRightsForProject) { StageBitz.Data.Project project = GetBL <ProjectBL>().GetProjectByLastUpdatedDateTime(ProjectID, OriginalLastUpdatedDate); if (project == null) { StageBitzException.ThrowException(new ConcurrencyException(ExceptionOrigin.ProjectDetails, ProjectID)); } ////Check whether the same project name exist in the company. if (!IsValidToSave()) { errormsg.InnerText = "Project Name cannot be duplicated within the company."; return; } bool shouldChangeCreatedForTag = false; string oldProjectName = project.ProjectName; string newProjectName = txtName.Text.Trim(); // Create notifications, if the project name is being changed. // Change Item's CreatedFor field.(if item is created from this project) if (project.ProjectName != newProjectName) { Notification nf = new Notification(); nf.ModuleTypeCodeId = Support.GetCodeIdByCodeValue("ModuleType", "PROJECT"); nf.OperationTypeCodeId = Support.GetCodeIdByCodeValue("OperationType", "EDIT"); nf.RelatedId = project.ProjectId; nf.ProjectId = project.ProjectId; nf.Message = string.Format("{0} edited Project Name.", Support.UserFullName); nf.CreatedByUserId = nf.LastUpdatedByUserId = UserID; nf.CreatedDate = nf.LastUpdatedDate = Now; GetBL <NotificationBL>().AddNotification(nf); #region Initialize Update CreatedFor field shouldChangeCreatedForTag = true; #endregion Initialize Update CreatedFor field } project.ProjectName = newProjectName; project.LastUpdatedByUserId = UserID; project.LastUpdatedDate = Now; GetBL <ProjectBL>().SaveChanges(); #region Update CreatedFor field if (shouldChangeCreatedForTag) { DataContext.UpdateCreatedForField(project.ProjectId, newProjectName, oldProjectName); } #endregion Update CreatedFor field } }
/// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> /// <exception cref="System.Exception">User does not have permission to access the project team</exception> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { StageBitz.Data.Project project = DataContext.Projects.Where(p => p.ProjectId == ProjectId && p.IsActive == true).SingleOrDefault(); if (!Support.CanAccessProject(project)) { if (IsProjectClosed) { StageBitzException.ThrowException(new StageBitzException(ExceptionOrigin.ProjectClose, project.ProjectId, "This Project Is Closed.")); } throw new Exception("User does not have permission to access the project team"); } this.CompanyId = project.CompanyId; projectWarningPopup.ProjectId = ProjectId; warningDisplay.ProjectID = ProjectId; warningDisplay.LoadData(); sbPackageLimitsValidation.CompanyId = CompanyId; sbPackageLimitsValidation.DisplayMode = UserWeb.Controls.Company.PackageLimitsValidation.ViewMode.UserLimit; sbPackageLimitsValidation.LoadData(); LoadBreadCrumbs(); SetReadOnlyMode(project); if (!IsReadOnly) { searchUsers.DisplayMode = SearchUsers.ViewMode.ProjectTeam; searchUsers.ProjectId = ProjectId; searchUsers.LoadControl(); } else { searchUsers.Visible = false; } LoadProjectTeam(); #region SET LINKS lnkCompanyInventory.HRef = string.Format("~/Inventory/CompanyInventory.aspx?companyid={0}&relatedtable={1}&relatedid={2}", project.CompanyId, (int)BookingTypes.Project, ProjectId); lnkBookings.HRef = string.Format("~/Project/ProjectBookingDetails.aspx?projectid={0}", ProjectId); linkTaskManager.HRef = ResolveUrl(string.Format("~/ItemBrief/TaskManager.aspx?projectid={0}", ProjectId)); reportList.ShowReportLinks(string.Format("~/ItemBrief/ItemisedPurchaseReport.aspx?projectid={0}", ProjectId), string.Format("~/ItemBrief/BudgetSummaryReport.aspx?projectid={0}", ProjectId), ProjectId); projectUpdatesLink.ProjectID = ProjectId; projectUpdatesLink.LoadData(); #endregion SET LINKS #region SetValidationGroup string validationGroup = string.Concat(ucUserInvitationPopup.ClientID, "ValidationGroup"); btnApplyUserPermission.ValidationGroup = validationGroup; ucUserInvitationPopup.InitializeValidationGroup(validationGroup); #endregion SetValidationGroup } }
/// <summary> /// Handles the Click event of the btnInviteProjectMember control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void btnInviteProjectMember_Click(object sender, EventArgs e) { if (!PageBase.StopProcessing) { if (!Page.IsValid || !sbPackageLimitsValidation.Validate()) { return; } HideNotifications(); Invitation pendingInvitation = null; User user = null; if (SelectedUserId > 0) { user = this.GetBL <PersonalBL>().GetUser(SelectedUserId); //Check whether this user already has a pending invitation. pendingInvitation = GetPendingInvitationForUser(user); } else { pendingInvitation = GetPendingInvitationForEmail(SelectedUserEmail); } if (pendingInvitation != null) { //This scenario can only occur if the user accidentaly double clicks the send button. //So the popup is silently closed without doing anything. divSearchResults.Visible = false; popupInviteProjectMember.HidePopup(); } else { string fromUserFullName = (Support.UserFirstName + " " + Support.UserLastName).Trim(); string fromUserEmail = (from u in DataContext.Users where u.UserId == UserID select u.Email1).FirstOrDefault(); StageBitz.Data.Project project = (from p in DataContext.Projects where p.ProjectId == ProjectId select p).FirstOrDefault(); string projectName = project.ProjectName; string companyName = (from c in DataContext.Companies where c.CompanyId == project.CompanyId select c.CompanyName).FirstOrDefault(); string projectRole = ucUserInvitationPopup.ProjectRole;// txtProjectRole.Text.Trim(); #region Create and save Invitation object Invitation invitation = new Invitation(); DataContext.Invitations.AddObject(invitation); invitation.FromUserId = UserID; if (SelectedUserId > 0) { invitation.ToUserId = SelectedUserId; invitation.ToEmail = user.Email1; } else { invitation.ToName = ucUserInvitationPopup.ProjectInvitePersonName; //txtProjInvitePersonName.Text.Trim(); invitation.ToEmail = SelectedUserEmail; } invitation.InvitationUserRoles.Add( new InvitationUserRole { CreatedByUserId = UserID, CreatedDate = Now, IsActive = true, LastUpdatedByUserId = UserID, LastUpdatedDate = Now, UserTypeCodeId = Support.GetCodeIdByCodeValue("ProjectUserTypeCode", ucUserInvitationPopup.IsProjectObserverRadioChecked ? "OBSERVER" : "STAFF") } ); invitation.InvitationTypeCodeId = GetInvitationTypeCodeId(ViewMode.ProjectTeam); invitation.InvitationStatusCodeId = Support.GetCodeIdByCodeValue("InvitationStatus", "PENDING"); invitation.ProjectRole = projectRole; invitation.RelatedTable = StageBitz.Common.Constants.GlobalConstants.RelatedTables.UserRoleTypes.Projects; invitation.RelatedId = ProjectId; invitation.CreatedByUserId = invitation.LastUpdatedByUserId = UserID; invitation.CreatedDate = invitation.LastUpdatedDate = Now; invitation.CanSeeProjectBudgetSummary = ucUserInvitationPopup.IsBudgetSummaryChecked; DataContext.SaveChanges(); #endregion Create and save Invitation object string toUserFullName = string.Empty; if (SelectedUserId > 0) { toUserFullName = (user.FirstName + " " + user.LastName).Trim(); string toEmail = user.Email1; string dashboardUrl = StageBitzUrl + "/" + "Default.aspx"; if (!user.IsActive) { dashboardUrl = string.Format("{0}/Public/Invitation.aspx?invitationCode={1}", StageBitzUrl, HttpServerUtility.UrlTokenEncode(Utils.EncryptStringAES(invitation.InvitationId.ToString()))); } //Send invitation email for existing user EmailSender.StageBitzUrl = Support.GetSystemUrl(); EmailSender.InviteProjectTeamExistingUser( (ucUserInvitationPopup.IsProjectObserverRadioChecked ? EmailSender.ProjectTeamUserType.Observer : EmailSender.ProjectTeamUserType.Staff), toEmail, toUserFullName, fromUserFullName, fromUserEmail, companyName, projectName, projectRole, dashboardUrl); divInviteSent.InnerText = string.Format("{0} ({1}) has been invited to the project.", Support.TruncateString(toUserFullName, 50), Support.TruncateString(toEmail, 50)); } else { toUserFullName = ucUserInvitationPopup.ProjectInvitePersonName;//txtProjInvitePersonName.Text.Trim(); string toEmail = SelectedUserEmail; string invitationUrl = string.Format("{0}/Public/Invitation.aspx?invitationCode={1}", StageBitzUrl, HttpServerUtility.UrlTokenEncode(Utils.EncryptStringAES(invitation.InvitationId.ToString()))); //Send invitation email for new user EmailSender.StageBitzUrl = Support.GetSystemUrl(); EmailSender.InviteProjectTeamNewUser( (ucUserInvitationPopup.IsProjectObserverRadioChecked ? EmailSender.ProjectTeamUserType.Observer : EmailSender.ProjectTeamUserType.Staff), toEmail, toUserFullName, fromUserFullName, fromUserEmail, companyName, projectName, projectRole, invitationUrl); divInviteSent.InnerText = string.Format("'{0}' has been invited to the project.", Support.TruncateString(SelectedUserEmail, 50)); } #region Notifications Notification nf = new Notification(); nf.ModuleTypeCodeId = Support.GetCodeIdByCodeValue("ModuleType", "PROJTEAM"); nf.OperationTypeCodeId = Support.GetCodeIdByCodeValue("OperationType", "ADD"); nf.RelatedId = ProjectId; nf.ProjectId = ProjectId; nf.Message = string.Format("{0} invited {1} to the Project.", Support.UserFullName, toUserFullName); nf.CreatedByUserId = nf.LastUpdatedByUserId = UserID; nf.CreatedDate = nf.LastUpdatedDate = Now; DataContext.Notifications.AddObject(nf); DataContext.SaveChanges(); #endregion Notifications divInviteSent.Visible = true; divSearchResults.Visible = false; popupInviteProjectMember.HidePopup(); } if (InvitationSent != null) { InvitationSent(this, EventArgs.Empty); } } }
/// <summary> /// Handles the Load event of the Page control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (ProjectID > 0) { //Load the project StageBitz.Data.Project project = (from p in DataContext.Projects where p.ProjectId == ProjectID && p.IsActive == true select p).FirstOrDefault(); if (project != null) { if (project.StartDate == DateTime.MinValue || project.StartDate == null) { startDate.Text = "TBC"; } else { startDate.Text = Support.FormatDate(project.StartDate); } if (project.EndDate == DateTime.MinValue || project.EndDate == null) { endDate.Text = "TBC"; } else { endDate.Text = Support.FormatDate(project.EndDate); } } //Load the top 10 events that are not being expired. var eventList = (from pe in DataContext.ProjectEvents join proj in DataContext.Projects on pe.ProjectId equals proj.ProjectId where pe.ProjectId == ProjectID && pe.EventDate > Now && proj.IsActive == true orderby pe.EventDate select pe).Take(9).ToList <ProjectEvent>(); ConfigureGrids(eventList); int eventListCount = eventList.Count(); if (eventListCount > 0) { if (left > 0) { gvEventsLeft.DataSource = eventList.Take(left); gvEventsLeft.DataBind(); } if (middle > 0) { gvMiddle.DataSource = eventList.Skip(left).Take(middle); gvMiddle.DataBind(); divLeft.Style["border-right"] = "1px Solid Black"; } if (right > 0) { gvRight.DataSource = eventList.Skip(left + middle).Take(right); gvRight.DataBind(); divMiddle.Style["border-right"] = "1px Solid Black"; } ////Assign top 5 to left grid //gvEventsLeft.DataSource = eventList.Take(3); //gvEventsLeft.DataBind(); //if (eventList.Skip(3).Count() > 0) //{ // //Assign next 5 to right grid // gvMiddle.DataSource = eventList.Skip(3).Take(3); // gvMiddle.DataBind(); //} //else //{ // divMiddle.Visible = false; //} //if (eventList.Skip(6).Count() > 0) //{ // gvRight.DataSource = eventList.Skip(6).Take(3); // gvRight.DataBind(); //} //else //{ // divRight.Visible = false; //} ltlEventFeedback.Visible = true; } else { divGridArea.Visible = false; } ltlEventFeedback.Visible = (eventListCount > 0); ltlNoEventFeedback.Visible = !(eventListCount > 0); lnkSchedule.HRef = ResolveUrl(string.Format("~/Project/ProjectSchedule.aspx?projectid={0}", ProjectID)); } } }
/// <summary> /// Saves the schedule. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void SaveSchedule(object sender, EventArgs e) { if (!StopProcessing) { bool isReadOnlyRightsForProject = Support.IsReadOnlyRightsForProject(ProjectID); if (Page.IsValid && !isReadOnlyRightsForProject) { StageBitz.Data.Project project = (from p in DataContext.Projects where p.ProjectId == ProjectID && p.LastUpdatedDate == OriginalLastUpdatedDate select p).FirstOrDefault(); if (project == null) { StageBitzException.ThrowException(new ConcurrencyException(ExceptionOrigin.ProjectDetails, ProjectID)); } #region Notification string message = string.Empty; //Build the message if ((ucProjectEvents.ProjectStartDate != project.StartDate && ucProjectEvents.ProjectStartDate != DateTime.MinValue || ucProjectEvents.ProjectStartDate == DateTime.MinValue && project.StartDate != null) && (ucProjectEvents.ProjectEndDate != project.EndDate && ucProjectEvents.ProjectEndDate != DateTime.MinValue || ucProjectEvents.ProjectEndDate == DateTime.MinValue && project.EndDate != null)) { message = string.Format("{0} changed Project Start date and End date.", Support.UserFullName); } else if (ucProjectEvents.ProjectStartDate != project.StartDate && ucProjectEvents.ProjectStartDate != DateTime.MinValue || ucProjectEvents.ProjectStartDate == DateTime.MinValue && project.StartDate != null) { message = string.Format("{0} changed the Project Start date.", Support.UserFullName); } else if (ucProjectEvents.ProjectEndDate != project.EndDate && ucProjectEvents.ProjectEndDate != DateTime.MinValue || ucProjectEvents.ProjectEndDate == DateTime.MinValue && project.EndDate != null) { message = string.Format("{0} changed the Project End date.", Support.UserFullName); } if (message != string.Empty) { Notification nf = new Notification(); nf.ModuleTypeCodeId = Support.GetCodeIdByCodeValue("ModuleType", "SCHEDULE"); nf.OperationTypeCodeId = Support.GetCodeIdByCodeValue("OperationType", "EDIT"); nf.RelatedId = ProjectID; nf.ProjectId = ProjectID; nf.Message = message; nf.CreatedByUserId = nf.LastUpdatedByUserId = UserID; nf.CreatedDate = nf.LastUpdatedDate = Now; DataContext.Notifications.AddObject(nf); } #endregion Notification if (ucProjectEvents.ProjectStartDate != DateTime.MinValue) { project.StartDate = ucProjectEvents.ProjectStartDate; } else { project.StartDate = null; } if (ucProjectEvents.ProjectEndDate != DateTime.MinValue) { project.EndDate = ucProjectEvents.ProjectEndDate; } else { project.EndDate = null; } project.LastUpdatedByUserId = UserID; project.LastUpdatedDate = Now; DataContext.SaveChanges(); } Response.Redirect(string.Format("~/Project/ProjectDashboard.aspx?projectid={0}", ProjectID)); } }