From b1c52c36eb4345332713391e8f39ec346d3e2481 Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Thu, 11 Sep 2014 22:23:48 +0300 Subject: [PATCH] Added functionality of Service Levels --- WebsitePanel/Database/update_db.sql | 700 ++++++++++++++++++ .../HostedSolution/ServiceLevel.cs | 33 + .../Packages/Quotas.cs | 1 + .../Servers/ResourceGroups.cs | 1 + .../WebsitePanel.EnterpriseServer.Base.csproj | 1 + .../OrganizationProxy.cs | 423 ++++++++++- .../Data/DataProvider.cs | 78 ++ .../ExchangeServerController.cs | 25 + .../HostedSolution/OrganizationController.cs | 130 +++- .../esOrganizations.asmx.cs | 39 +- .../HostedSolution/ExchangeAccount.cs | 18 +- .../HostedSolution/OrganizationUser.cs | 14 + .../WebsitePanel_SharedResources.ascx.resx | 14 +- .../SettingsServiceLevels.ascx.resx | 144 ++++ .../UserAccountPolicySettings.ascx.resx | 3 + .../ExchangeMailboxes.ascx.resx | 3 + .../OrganizationUserGeneralSettings.ascx.resx | 9 + .../OrganizationUsers.ascx.resx | 3 + .../ExchangeCreateMailbox.ascx.cs | 4 +- .../ExchangeServer/ExchangeMailboxes.ascx | 20 +- .../ExchangeServer/ExchangeMailboxes.ascx.cs | 37 +- .../ExchangeMailboxes.ascx.designer.cs | 28 - .../OrganizationCreateUser.ascx.cs | 4 +- .../OrganizationUserGeneralSettings.ascx | 25 +- .../OrganizationUserGeneralSettings.ascx.cs | 66 +- ...zationUserGeneralSettings.ascx.designer.cs | 82 +- .../ExchangeServer/OrganizationUsers.ascx | 15 +- .../ExchangeServer/OrganizationUsers.ascx.cs | 26 +- .../OrganizationUsers.ascx.designer.cs | 28 - .../WebsitePanel/SettingsEditor.ascx.cs | 2 +- .../WebsitePanel/SettingsServiceLevels.ascx | 84 +++ .../SettingsServiceLevels.ascx.cs | 176 +++++ .../SettingsServiceLevels.ascx.designer.cs | 132 ++++ .../WebsitePanel/SpaceQuotasControl.ascx | 2 +- .../WebsitePanel/SpaceQuotasControl.ascx.cs | 8 + .../SpaceQuotasControl.ascx.designer.cs | 28 - .../UserAccountPolicySettings.ascx | 4 + ...UserAccountPolicySettings.ascx.designer.cs | 38 +- .../WebsitePanel.Portal.Modules.csproj | 9 + 39 files changed, 2282 insertions(+), 175 deletions(-) create mode 100644 WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/HostedSolution/ServiceLevel.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsServiceLevels.ascx.resx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.cs create mode 100644 WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.designer.cs diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index aad554db..80899c0a 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -4506,3 +4506,703 @@ GO UPDATE [dbo].[ScheduleTaskParameters] SET [DefaultValue]= N'MsSQL2005=SQL Server 2005;MsSQL2008=SQL Server 2008;MsSQL2012=SQL Server 2012;MsSQL2014=SQL Server 2014;MySQL4=MySQL 4.0;MySQL5=MySQL 5.0' WHERE [TaskID]= 'SCHEDULE_TASK_BACKUP_DATABASE' AND [ParameterID]='DATABASE_GROUP' GO +/*SUPPORT SERVICE LEVELS*/ + +IF NOT EXISTS (SELECT * FROM [dbo].[ResourceGroups] WHERE [GroupName] = 'Service Levels') +BEGIN +INSERT [dbo].[ResourceGroups] ([GroupID], [GroupName], [GroupOrder], [GroupController], [ShowGroup]) VALUES (47, N'Service Levels', 2, NULL, 1) +END +GO + +IF NOT EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'SupportServiceLevels') +CREATE TABLE SupportServiceLevels +( +[LevelID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, +[LevelName] NVARCHAR(100) NOT NULL, +[LevelDescription] NVARCHAR(1000) NULL +) +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetSupportServiceLevels') +DROP PROCEDURE GetSupportServiceLevels +GO + +CREATE PROCEDURE [dbo].[GetSupportServiceLevels] +AS +SELECT * +FROM SupportServiceLevels +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetSupportServiceLevel') +DROP PROCEDURE GetSupportServiceLevel +GO + +CREATE PROCEDURE [dbo].[GetSupportServiceLevel] +( + @LevelID int +) +AS +SELECT * +FROM SupportServiceLevels +WHERE LevelID = @LevelID +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddSupportServiceLevel') +DROP PROCEDURE AddSupportServiceLevel +GO + +CREATE PROCEDURE [dbo].[AddSupportServiceLevel] +( + @LevelID int OUTPUT, + @LevelName nvarchar(100), + @LevelDescription nvarchar(1000) +) +AS +BEGIN + + IF EXISTS (SELECT * FROM SupportServiceLevels WHERE LevelName = @LevelName) + BEGIN + SET @LevelID = -1 + + RETURN + END + + INSERT INTO SupportServiceLevels + ( + LevelName, + LevelDescription + ) + VALUES + ( + @LevelName, + @LevelDescription + ) + + SET @LevelID = SCOPE_IDENTITY() + + DECLARE @ResourseGroupID int + + IF EXISTS (SELECT * FROM ResourceGroups WHERE GroupName = 'Service Levels') + BEGIN + DECLARE @QuotaLastID int, @CurQuotaName nvarchar(100), + @CurQuotaDescription nvarchar(1000), @QuotaOrderInGroup int + + SET @CurQuotaName = N'ServiceLevel.' + @LevelName + SET @CurQuotaDescription = @LevelName + N', users' + + SELECT @ResourseGroupID = GroupID FROM ResourceGroups WHERE GroupName = 'Service Levels' + + SELECT @QuotaLastID = MAX(QuotaID) FROM Quotas + + SELECT @QuotaOrderInGroup = MAX(QuotaOrder) FROM Quotas WHERE GroupID = @ResourseGroupID + + IF @QuotaOrderInGroup IS NULL SET @QuotaOrderInGroup = 0 + + IF NOT EXISTS (SELECT * FROM Quotas WHERE QuotaName = @CurQuotaName) + BEGIN + INSERT Quotas + (QuotaID, + GroupID, + QuotaOrder, + QuotaName, + QuotaDescription, + QuotaTypeID, + ServiceQuota, + ItemTypeID) + VALUES + (@QuotaLastID + 1, + @ResourseGroupID, + @QuotaOrderInGroup + 1, + @CurQuotaName, + @CurQuotaDescription, + 3, + 0, + NULL) + END + END + +END + +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteSupportServiceLevel') +DROP PROCEDURE DeleteSupportServiceLevel +GO + +CREATE PROCEDURE [dbo].[DeleteSupportServiceLevel] +( + @LevelID int +) +AS +BEGIN + + DECLARE @LevelName nvarchar(100), @QuotaName nvarchar(100), @QuotaID int + + SELECT @LevelName = LevelName FROM SupportServiceLevels WHERE LevelID = @LevelID + + SET @QuotaName = N'ServiceLevel.' + @LevelName + + SELECT @QuotaID = QuotaID FROM Quotas WHERE QuotaName = @QuotaName + + IF @QuotaID IS NOT NULL + BEGIN + DELETE FROM HostingPlanQuotas WHERE QuotaID = @QuotaID + DELETE FROM PackageQuotas WHERE QuotaID = @QuotaID + DELETE FROM Quotas WHERE QuotaID = @QuotaID + END + + IF EXISTS (SELECT * FROM ExchangeAccounts WHERE LevelID = @LevelID) + UPDATE ExchangeAccounts + SET LevelID = NULL + WHERE LevelID = @LevelID + + DELETE FROM SupportServiceLevels WHERE LevelID = @LevelID + +END + +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'UpdateSupportServiceLevel') +DROP PROCEDURE UpdateSupportServiceLevel +GO + +CREATE PROCEDURE [dbo].[UpdateSupportServiceLevel] +( + @LevelID int, + @LevelName nvarchar(100), + @LevelDescription nvarchar(1000) +) +AS +BEGIN + + DECLARE @PrevQuotaName nvarchar(100), @PrevLevelName nvarchar(100) + + SELECT @PrevLevelName = LevelName FROM SupportServiceLevels WHERE LevelID = @LevelID + + SET @PrevQuotaName = N'ServiceLevel.' + @PrevLevelName + + UPDATE SupportServiceLevels + SET LevelName = @LevelName, + LevelDescription = @LevelDescription + WHERE LevelID = @LevelID + + IF EXISTS (SELECT * FROM Quotas WHERE QuotaName = @PrevQuotaName) + BEGIN + DECLARE @QuotaID INT + + SELECT @QuotaID = QuotaID FROM Quotas WHERE QuotaName = @PrevQuotaName + + UPDATE Quotas + SET QuotaName = N'ServiceLevel.' + @LevelName, + QuotaDescription = @LevelName + ', users' + WHERE QuotaID = @QuotaID + END + +END + +RETURN +GO + +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='ExchangeAccounts' AND COLS.name='LevelID') +BEGIN +ALTER TABLE [dbo].[ExchangeAccounts] ADD + [LevelID] [int] NULL, + [IsVIP] [bit] NOT NULL DEFAULT 0 +END +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type IN ('FN', 'IF', 'TF') AND name = 'GetPackageServiceLevelResource') +DROP FUNCTION GetPackageServiceLevelResource +GO + +CREATE FUNCTION dbo.GetPackageServiceLevelResource +( + @PackageID int, + @GroupID int, + @ServerID int +) +RETURNS bit +AS +BEGIN + +IF NOT EXISTS (SELECT * FROM dbo.ResourceGroups WHERE GroupID = @GroupID AND GroupName = 'Service Levels') +RETURN 0 + +IF @PackageID IS NULL +RETURN 1 + +DECLARE @Result bit +SET @Result = 1 -- enabled + +DECLARE @PID int, @ParentPackageID int +SET @PID = @PackageID + +DECLARE @OverrideQuotas bit + +IF @ServerID IS NULL OR @ServerID = 0 +SELECT @ServerID = ServerID FROM Packages +WHERE PackageID = @PackageID + +WHILE 1 = 1 +BEGIN + + DECLARE @GroupEnabled int + + -- get package info + SELECT + @ParentPackageID = ParentPackageID, + @OverrideQuotas = OverrideQuotas + FROM Packages WHERE PackageID = @PID + + -- check if this is a root 'System' package + SET @GroupEnabled = 1 -- enabled + IF @ParentPackageID IS NULL + BEGIN + + IF @ServerID = 0 + RETURN 0 + ELSE IF @PID = -1 + RETURN 1 + ELSE IF @ServerID IS NULL + RETURN 1 + ELSE IF @ServerID > 0 + RETURN 1 + ELSE RETURN 0 + END + ELSE -- parentpackage is not null + BEGIN + -- check the current package + IF @OverrideQuotas = 1 + BEGIN + IF NOT EXISTS( + SELECT GroupID FROM PackageResources WHERE GroupID = @GroupID AND PackageID = @PID + ) + SET @GroupEnabled = 0 + END + ELSE + BEGIN + IF NOT EXISTS( + SELECT HPR.GroupID FROM Packages AS P + INNER JOIN HostingPlanResources AS HPR ON P.PlanID = HPR.PlanID + WHERE HPR.GroupID = @GroupID AND P.PackageID = @PID + ) + SET @GroupEnabled = 0 + END + + -- check addons + IF EXISTS( + SELECT HPR.GroupID FROM PackageAddons AS PA + INNER JOIN HostingPlanResources AS HPR ON PA.PlanID = HPR.PlanID + WHERE HPR.GroupID = @GroupID AND PA.PackageID = @PID + AND PA.StatusID = 1 -- active add-on + ) + SET @GroupEnabled = 1 + END + + IF @GroupEnabled = 0 + RETURN 0 + + SET @PID = @ParentPackageID + +END -- end while + +RETURN @Result +END +GO + +ALTER PROCEDURE [dbo].[GetPackageQuotasForEdit] +( + @ActorID int, + @PackageID int +) +AS + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +DECLARE @ServerID int, @ParentPackageID int, @PlanID int +SELECT @ServerID = ServerID, @ParentPackageID = ParentPackageID, @PlanID = PlanID FROM Packages +WHERE PackageID = @PackageID + +-- get resource groups +SELECT + RG.GroupID, + RG.GroupName, + ISNULL(PR.CalculateDiskSpace, ISNULL(HPR.CalculateDiskSpace, 0)) AS CalculateDiskSpace, + ISNULL(PR.CalculateBandwidth, ISNULL(HPR.CalculateBandwidth, 0)) AS CalculateBandwidth, + --dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, @ServerID) AS Enabled, + CASE + WHEN RG.GroupName = 'Service Levels' THEN dbo.GetPackageServiceLevelResource(PackageID, RG.GroupID, @ServerID) + ELSE dbo.GetPackageAllocatedResource(PackageID, RG.GroupID, @ServerID) + END AS Enabled, + --dbo.GetPackageAllocatedResource(@ParentPackageID, RG.GroupID, @ServerID) AS ParentEnabled + CASE + WHEN RG.GroupName = 'Service Levels' THEN dbo.GetPackageServiceLevelResource(@ParentPackageID, RG.GroupID, @ServerID) + ELSE dbo.GetPackageAllocatedResource(@ParentPackageID, RG.GroupID, @ServerID) + END AS ParentEnabled +FROM ResourceGroups AS RG +LEFT OUTER JOIN PackageResources AS PR ON RG.GroupID = PR.GroupID AND PR.PackageID = @PackageID +LEFT OUTER JOIN HostingPlanResources AS HPR ON RG.GroupID = HPR.GroupID AND HPR.PlanID = @PlanID +ORDER BY RG.GroupOrder + + +-- return quotas +SELECT + Q.QuotaID, + Q.GroupID, + Q.QuotaName, + Q.QuotaDescription, + Q.QuotaTypeID, + CASE + WHEN PQ.QuotaValue IS NULL THEN dbo.GetPackageAllocatedQuota(@PackageID, Q.QuotaID) + ELSE PQ.QuotaValue + END QuotaValue, + dbo.GetPackageAllocatedQuota(@ParentPackageID, Q.QuotaID) AS ParentQuotaValue +FROM Quotas AS Q +LEFT OUTER JOIN PackageQuotas AS PQ ON PQ.QuotaID = Q.QuotaID AND PQ.PackageID = @PackageID +ORDER BY Q.QuotaOrder + +RETURN +GO + +ALTER PROCEDURE [dbo].[GetPackageQuotas] +( + @ActorID int, + @PackageID int +) +AS + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +DECLARE @PlanID int, @ParentPackageID int +SELECT @PlanID = PlanID, @ParentPackageID = ParentPackageID FROM Packages +WHERE PackageID = @PackageID + +-- get resource groups +SELECT + RG.GroupID, + RG.GroupName, + ISNULL(HPR.CalculateDiskSpace, 0) AS CalculateDiskSpace, + ISNULL(HPR.CalculateBandwidth, 0) AS CalculateBandwidth, + --dbo.GetPackageAllocatedResource(@ParentPackageID, RG.GroupID, 0) AS ParentEnabled + CASE + WHEN RG.GroupName = 'Service Levels' THEN dbo.GetPackageServiceLevelResource(@ParentPackageID, RG.GroupID, 0) + ELSE dbo.GetPackageAllocatedResource(@ParentPackageID, RG.GroupID, 0) + END AS ParentEnabled +FROM ResourceGroups AS RG +LEFT OUTER JOIN HostingPlanResources AS HPR ON RG.GroupID = HPR.GroupID AND HPR.PlanID = @PlanID +--WHERE dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, 0) = 1 +WHERE (dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, 0) = 1 AND RG.GroupName <> 'Service Levels') OR + (dbo.GetPackageServiceLevelResource(@PackageID, RG.GroupID, 0) = 1 AND RG.GroupName = 'Service Levels') +ORDER BY RG.GroupOrder + + +-- return quotas +SELECT + Q.QuotaID, + Q.GroupID, + Q.QuotaName, + Q.QuotaDescription, + Q.QuotaTypeID, + dbo.GetPackageAllocatedQuota(@PackageID, Q.QuotaID) AS QuotaValue, + dbo.GetPackageAllocatedQuota(@ParentPackageID, Q.QuotaID) AS ParentQuotaValue, + ISNULL(dbo.CalculateQuotaUsage(@PackageID, Q.QuotaID), 0) AS QuotaUsedValue +FROM Quotas AS Q +WHERE Q.HideQuota IS NULL OR Q.HideQuota = 0 +ORDER BY Q.QuotaOrder +RETURN +GO + +ALTER PROCEDURE [dbo].[GetHostingPlanQuotas] +( + @ActorID int, + @PlanID int, + @PackageID int, + @ServerID int +) +AS + +-- check rights +IF dbo.CheckActorParentPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +DECLARE @IsAddon bit + +IF @ServerID = 0 +SELECT @ServerID = ServerID FROM Packages +WHERE PackageID = @PackageID + +-- get resource groups +SELECT + RG.GroupID, + RG.GroupName, + CASE + WHEN HPR.CalculateDiskSpace IS NULL THEN CAST(0 as bit) + ELSE CAST(1 as bit) + END AS Enabled, + --dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, @ServerID) AS ParentEnabled, + CASE + WHEN RG.GroupName = 'Service Levels' THEN dbo.GetPackageServiceLevelResource(@PackageID, RG.GroupID, @ServerID) + ELSE dbo.GetPackageAllocatedResource(@PackageID, RG.GroupID, @ServerID) + END AS ParentEnabled, + ISNULL(HPR.CalculateDiskSpace, 1) AS CalculateDiskSpace, + ISNULL(HPR.CalculateBandwidth, 1) AS CalculateBandwidth +FROM ResourceGroups AS RG +LEFT OUTER JOIN HostingPlanResources AS HPR ON RG.GroupID = HPR.GroupID AND HPR.PlanID = @PlanID +WHERE (RG.ShowGroup = 1) +ORDER BY RG.GroupOrder + +-- get quotas by groups +SELECT + Q.QuotaID, + Q.GroupID, + Q.QuotaName, + Q.QuotaDescription, + Q.QuotaTypeID, + ISNULL(HPQ.QuotaValue, 0) AS QuotaValue, + dbo.GetPackageAllocatedQuota(@PackageID, Q.QuotaID) AS ParentQuotaValue +FROM Quotas AS Q +LEFT OUTER JOIN HostingPlanQuotas AS HPQ ON Q.QuotaID = HPQ.QuotaID AND HPQ.PlanID = @PlanID +WHERE Q.HideQuota IS NULL OR Q.HideQuota = 0 +ORDER BY Q.QuotaOrder +RETURN +GO + +ALTER PROCEDURE [dbo].[SearchOrganizationAccounts] +( + @ActorID int, + @ItemID int, + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @IncludeMailboxes bit +) +AS +DECLARE @PackageID int +SELECT @PackageID = PackageID FROM ServiceItems +WHERE ItemID = @ItemID + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- start +DECLARE @condition nvarchar(700) +SET @condition = ' +(EA.AccountType = 7 OR (EA.AccountType = 1 AND @IncludeMailboxes = 1) ) +AND EA.ItemID = @ItemID +' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'EA.DisplayName ASC' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT + EA.AccountID, + EA.ItemID, + EA.AccountType, + EA.AccountName, + EA.DisplayName, + EA.PrimaryEmailAddress, + EA.SubscriberNumber, + EA.UserPrincipalName, + EA.LevelID, + EA.IsVIP +FROM ExchangeAccounts AS EA +WHERE ' + @condition + +print @sql + +exec sp_executesql @sql, N'@ItemID int, @IncludeMailboxes bit', +@ItemID, @IncludeMailboxes + +RETURN +GO + +ALTER PROCEDURE [dbo].[GetExchangeAccount] +( + @ItemID int, + @AccountID int +) +AS +SELECT + E.AccountID, + E.ItemID, + E.AccountType, + E.AccountName, + E.DisplayName, + E.PrimaryEmailAddress, + E.MailEnabledPublicFolder, + E.MailboxManagerActions, + E.SamAccountName, + E.AccountPassword, + E.MailboxPlanId, + P.MailboxPlan, + E.SubscriberNumber, + E.UserPrincipalName, + E.ArchivingMailboxPlanId, + AP.MailboxPlan as 'ArchivingMailboxPlan', + E.EnableArchiving, + E.LevelID, + E.IsVIP +FROM + ExchangeAccounts AS E +LEFT OUTER JOIN ExchangeMailboxPlans AS P ON E.MailboxPlanId = P.MailboxPlanId +LEFT OUTER JOIN ExchangeMailboxPlans AS AP ON E.ArchivingMailboxPlanId = AP.MailboxPlanId +WHERE + E.ItemID = @ItemID AND + E.AccountID = @AccountID +RETURN +GO + +ALTER PROCEDURE [dbo].[GetExchangeAccountsPaged] +( + @ActorID int, + @ItemID int, + @AccountTypes nvarchar(30), + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @StartRow int, + @MaximumRows int, + @Archiving bit +) +AS + +DECLARE @PackageID int +SELECT @PackageID = PackageID FROM ServiceItems +WHERE ItemID = @ItemID + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- start +DECLARE @condition nvarchar(700) +SET @condition = ' +EA.AccountType IN (' + @AccountTypes + ') +AND EA.ItemID = @ItemID +' + +IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL +AND @FilterValue <> '' AND @FilterValue IS NOT NULL +BEGIN + IF @FilterColumn = 'PrimaryEmailAddress' AND @AccountTypes <> '2' + BEGIN + SET @condition = @condition + ' AND EA.AccountID IN (SELECT EAEA.AccountID FROM ExchangeAccountEmailAddresses EAEA WHERE EAEA.EmailAddress LIKE ''' + @FilterValue + ''')' + END + ELSE + BEGIN + SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + '''' + END +END + +if @Archiving = 1 +BEGIN + SET @condition = @condition + ' AND (EA.ArchivingMailboxPlanId > 0) ' +END + +IF @SortColumn IS NULL OR @SortColumn = '' +SET @SortColumn = 'EA.DisplayName ASC' + +DECLARE @joincondition nvarchar(700) + SET @joincondition = ',P.MailboxPlan FROM ExchangeAccounts AS EA + LEFT OUTER JOIN ExchangeMailboxPlans AS P ON EA.MailboxPlanId = P.MailboxPlanId' + +DECLARE @sql nvarchar(3500) + +set @sql = ' +SELECT COUNT(EA.AccountID) FROM ExchangeAccounts AS EA +WHERE ' + @condition + '; + +WITH Accounts AS ( + SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') as Row, + EA.AccountID, + EA.ItemID, + EA.AccountType, + EA.AccountName, + EA.DisplayName, + EA.PrimaryEmailAddress, + EA.MailEnabledPublicFolder, + EA.MailboxPlanId, + EA.SubscriberNumber, + EA.UserPrincipalName, + EA.LevelID, + EA.IsVIP ' + @joincondition + + ' WHERE ' + @condition + ' +) + +SELECT * FROM Accounts +WHERE Row BETWEEN @StartRow + 1 and @StartRow + @MaximumRows +' + +print @sql + +exec sp_executesql @sql, N'@ItemID int, @StartRow int, @MaximumRows int', +@ItemID, @StartRow, @MaximumRows + +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'UpdateExchangeAccountSLSettings') +DROP PROCEDURE UpdateExchangeAccountSLSettings +GO + +CREATE PROCEDURE [dbo].[UpdateExchangeAccountSLSettings] +( + @AccountID int, + @LevelID int, + @IsVIP bit +) +AS + +BEGIN TRAN + + IF (@LevelID = -1) + BEGIN + SET @LevelID = NULL + END + + UPDATE ExchangeAccounts SET + LevelID = @LevelID, + IsVIP = @IsVIP + WHERE + AccountID = @AccountID + + IF (@@ERROR <> 0 ) + BEGIN + ROLLBACK TRANSACTION + RETURN -1 + END +COMMIT TRAN +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'CheckServiceLevelUsage') +DROP PROCEDURE CheckServiceLevelUsage +GO + +CREATE PROCEDURE [dbo].[CheckServiceLevelUsage] +( + @LevelID int +) +AS +SELECT COUNT(EA.AccountID) +FROM SupportServiceLevels AS SL +INNER JOIN ExchangeAccounts AS EA ON SL.LevelID = EA.LevelID +WHERE EA.LevelID = @LevelID +RETURN +GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/HostedSolution/ServiceLevel.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/HostedSolution/ServiceLevel.cs new file mode 100644 index 00000000..72174095 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/HostedSolution/ServiceLevel.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.EnterpriseServer.Base.HostedSolution +{ + public class ServiceLevel + { + int levelId; + string levelName; + string levelDescription; + + public int LevelId + { + get { return levelId; } + set { levelId = value; } + } + + public string LevelName + { + get { return levelName; } + set { levelName = value; } + } + + public string LevelDescription + { + get { return levelDescription; } + set { levelDescription = value; } + } + } + +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs index 956aedcc..e6a2d6d9 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs @@ -255,5 +255,6 @@ order by rg.groupOrder public const string ENTERPRISESTORAGE_FOLDERS = "EnterpriseStorage.Folders"; public const string ENTERPRICESTORAGE_DRIVEMAPS = "EnterpriseStorage.DriveMaps"; + public const string SERVICE_LEVELS = "ServiceLevel."; } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs index 78480041..9494443f 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/ResourceGroups.cs @@ -55,5 +55,6 @@ namespace WebsitePanel.EnterpriseServer public const string VPSForPC = "VPSForPC"; public const string Lync = "Lync"; public const string EnterpriseStorage = "EnterpriseStorage"; + public const string ServiceLevels = "Service Levels"; } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj index 90172b0b..7ce9ade3 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/WebsitePanel.EnterpriseServer.Base.csproj @@ -117,6 +117,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs index 1d9d15f0..b81cc96d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs @@ -146,6 +146,16 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution private System.Threading.SendOrPostCallback SetDefaultOrganizationOperationCompleted; + private System.Threading.SendOrPostCallback GetSupportServiceLevelsOperationCompleted; + + private System.Threading.SendOrPostCallback UpdateSupportServiceLevelOperationCompleted; + + private System.Threading.SendOrPostCallback DeleteSupportServiceLevelOperationCompleted; + + private System.Threading.SendOrPostCallback AddSupportServiceLevelOperationCompleted; + + private System.Threading.SendOrPostCallback GetSupportServiceLevelOperationCompleted; + /// public esOrganizations() { @@ -272,6 +282,20 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution /// public event SetDefaultOrganizationCompletedEventHandler SetDefaultOrganizationCompleted; + /// + public event GetSupportServiceLevelsCompletedEventHandler GetSupportServiceLevelsCompleted; + + /// + public event UpdateSupportServiceLevelCompletedEventHandler UpdateSupportServiceLevelCompleted; + + /// + public event DeleteSupportServiceLevelCompletedEventHandler DeleteSupportServiceLevelCompleted; + + /// + public event AddSupportServiceLevelCompletedEventHandler AddSupportServiceLevelCompleted; + + /// + public event GetSupportServiceLevelCompletedEventHandler GetSupportServiceLevelCompleted; /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CheckOrgIdExists", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1415,7 +1439,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution string webPage, string notes, string externalEmail, - string subscriberNumber) + string subscriberNumber, + int levelId, + bool isVIP) { object[] results = this.Invoke("SetUserGeneralSettings", new object[] { itemId, @@ -1446,7 +1472,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution webPage, notes, externalEmail, - subscriberNumber}); + subscriberNumber, + levelId, + isVIP}); return ((int)(results[0])); } @@ -1481,6 +1509,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution string notes, string externalEmail, string subscriberNumber, + int levelId, + bool isVIP, System.AsyncCallback callback, object asyncState) { @@ -1513,7 +1543,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution webPage, notes, externalEmail, - subscriberNumber}, callback, asyncState); + subscriberNumber, + levelId, + isVIP}, callback, asyncState); } /// @@ -1553,9 +1585,11 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution string webPage, string notes, string externalEmail, - string subscriberNumber) + string subscriberNumber, + int levelId, + bool isVIP) { - this.SetUserGeneralSettingsAsync(itemId, accountId, displayName, password, hideAddressBook, disabled, locked, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, externalEmail, subscriberNumber, null); + this.SetUserGeneralSettingsAsync(itemId, accountId, displayName, password, hideAddressBook, disabled, locked, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, externalEmail, subscriberNumber, levelId, isVIP, null); } /// @@ -1589,6 +1623,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution string notes, string externalEmail, string subscriberNumber, + int levelId, + bool isVIP, object userState) { if ((this.SetUserGeneralSettingsOperationCompleted == null)) @@ -1624,7 +1660,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution webPage, notes, externalEmail, - subscriberNumber}, this.SetUserGeneralSettingsOperationCompleted, userState); + subscriberNumber, + levelId, + isVIP}, this.SetUserGeneralSettingsOperationCompleted, userState); } private void OnSetUserGeneralSettingsOperationCompleted(object arg) @@ -2663,6 +2701,255 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSupportServiceLevels", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ServiceLevel[] GetSupportServiceLevels() + { + object[] results = this.Invoke("GetSupportServiceLevels", new object[0]); + return ((ServiceLevel[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetSupportServiceLevels(System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetSupportServiceLevels", new object[0], callback, asyncState); + } + + /// + public ServiceLevel[] EndGetSupportServiceLevels(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((ServiceLevel[])(results[0])); + } + + /// + public void GetSupportServiceLevelsAsync() + { + this.GetSupportServiceLevelsAsync(null); + } + + /// + public void GetSupportServiceLevelsAsync(object userState) + { + if ((this.GetSupportServiceLevelsOperationCompleted == null)) + { + this.GetSupportServiceLevelsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSupportServiceLevelsOperationCompleted); + } + this.InvokeAsync("GetSupportServiceLevels", new object[0], this.GetSupportServiceLevelsOperationCompleted, userState); + } + + private void OnGetSupportServiceLevelsOperationCompleted(object arg) + { + if ((this.GetSupportServiceLevelsCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSupportServiceLevelsCompleted(this, new GetSupportServiceLevelsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/UpdateSupportServiceLevel", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void UpdateSupportServiceLevel(int levelID, string levelName, string levelDescription) + { + this.Invoke("UpdateSupportServiceLevel", new object[] { + levelID, + levelName, + levelDescription}); + } + + /// + public System.IAsyncResult BeginUpdateSupportServiceLevel(int levelID, string levelName, string levelDescription, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("UpdateSupportServiceLevel", new object[] { + levelID, + levelName, + levelDescription}, callback, asyncState); + } + + /// + public void EndUpdateSupportServiceLevel(System.IAsyncResult asyncResult) + { + this.EndInvoke(asyncResult); + } + + /// + public void UpdateSupportServiceLevelAsync(int levelID, string levelName, string levelDescription) + { + this.UpdateSupportServiceLevelAsync(levelID, levelName, levelDescription, null); + } + + /// + public void UpdateSupportServiceLevelAsync(int levelID, string levelName, string levelDescription, object userState) + { + if ((this.UpdateSupportServiceLevelOperationCompleted == null)) + { + this.UpdateSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUpdateSupportServiceLevelOperationCompleted); + } + this.InvokeAsync("UpdateSupportServiceLevel", new object[] { + levelID, + levelName, + levelDescription}, this.UpdateSupportServiceLevelOperationCompleted, userState); + } + + private void OnUpdateSupportServiceLevelOperationCompleted(object arg) + { + if ((this.UpdateSupportServiceLevelCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UpdateSupportServiceLevelCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/DeleteSupportServiceLevel", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject DeleteSupportServiceLevel(int levelId) + { + object[] results = this.Invoke("DeleteSupportServiceLevel", new object[] { + levelId}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginDeleteSupportServiceLevel(int levelId, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("DeleteSupportServiceLevel", new object[] { + levelId}, callback, asyncState); + } + + /// + public ResultObject EndDeleteSupportServiceLevel(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void DeleteSupportServiceLevelAsync(int levelId) + { + this.DeleteSupportServiceLevelAsync(levelId, null); + } + + /// + public void DeleteSupportServiceLevelAsync(int levelId, object userState) + { + if ((this.DeleteSupportServiceLevelOperationCompleted == null)) + { + this.DeleteSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteSupportServiceLevelOperationCompleted); + } + this.InvokeAsync("DeleteSupportServiceLevel", new object[] { + levelId}, this.DeleteSupportServiceLevelOperationCompleted, userState); + } + + private void OnDeleteSupportServiceLevelOperationCompleted(object arg) + { + if ((this.DeleteSupportServiceLevelCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.DeleteSupportServiceLevelCompleted(this, new DeleteSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddSupportServiceLevel", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddSupportServiceLevel(string levelName, string levelDescription) + { + object[] results = this.Invoke("AddSupportServiceLevel", new object[] { + levelName, + levelDescription}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginAddSupportServiceLevel(string levelName, string levelDescription, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("AddSupportServiceLevel", new object[] { + levelName, + levelDescription}, callback, asyncState); + } + + /// + public int EndAddSupportServiceLevel(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void AddSupportServiceLevelAsync(string levelName, string levelDescription) + { + this.AddSupportServiceLevelAsync(levelName, levelDescription, null); + } + + /// + public void AddSupportServiceLevelAsync(string levelName, string levelDescription, object userState) + { + if ((this.AddSupportServiceLevelOperationCompleted == null)) + { + this.AddSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddSupportServiceLevelOperationCompleted); + } + this.InvokeAsync("AddSupportServiceLevel", new object[] { + levelName, + levelDescription}, this.AddSupportServiceLevelOperationCompleted, userState); + } + + private void OnAddSupportServiceLevelOperationCompleted(object arg) + { + if ((this.AddSupportServiceLevelCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddSupportServiceLevelCompleted(this, new AddSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSupportServiceLevel", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ServiceLevel GetSupportServiceLevel(int levelID) + { + object[] results = this.Invoke("GetSupportServiceLevel", new object[] { + levelID}); + return ((ServiceLevel)(results[0])); + } + + /// + public System.IAsyncResult BeginGetSupportServiceLevel(int levelID, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetSupportServiceLevel", new object[] { + levelID}, callback, asyncState); + } + + /// + public ServiceLevel EndGetSupportServiceLevel(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((ServiceLevel)(results[0])); + } + + /// + public void GetSupportServiceLevelAsync(int levelID) + { + this.GetSupportServiceLevelAsync(levelID, null); + } + + /// + public void GetSupportServiceLevelAsync(int levelID, object userState) + { + if ((this.GetSupportServiceLevelOperationCompleted == null)) + { + this.GetSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSupportServiceLevelOperationCompleted); + } + this.InvokeAsync("GetSupportServiceLevel", new object[] { + levelID}, this.GetSupportServiceLevelOperationCompleted, userState); + } + + private void OnGetSupportServiceLevelOperationCompleted(object arg) + { + if ((this.GetSupportServiceLevelCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSupportServiceLevelCompleted(this, new GetSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { @@ -3791,4 +4078,128 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void SetDefaultOrganizationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void UpdateSupportServiceLevelCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void DeleteSupportServiceLevelCompletedEventHandler(object sender, DeleteSupportServiceLevelCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class DeleteSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal DeleteSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public ResultObject Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void AddSupportServiceLevelCompletedEventHandler(object sender, AddSupportServiceLevelCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal AddSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public int Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetSupportServiceLevelsCompletedEventHandler(object sender, GetSupportServiceLevelsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSupportServiceLevelsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetSupportServiceLevelsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public ServiceLevel[] Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((ServiceLevel[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetSupportServiceLevelCompletedEventHandler(object sender, GetSupportServiceLevelCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public ServiceLevel Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((ServiceLevel)(this.results[0])); + } + } + } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index ef79edce..7619168e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -2593,6 +2593,18 @@ namespace WebsitePanel.EnterpriseServer ); } + public static void UpdateExchangeAccountServiceLevelSettings(int accountId, int levelId, bool isVIP) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateExchangeAccountSLSettings", + new SqlParameter("@AccountID", accountId), + new SqlParameter("@LevelID", (levelId == 0) ? (object)DBNull.Value : (object)levelId), + new SqlParameter("@IsVIP", isVIP) + ); + } + public static void UpdateExchangeAccountUserPrincipalName(int accountId, string userPrincipalName) { SqlHelper.ExecuteNonQuery( @@ -4357,5 +4369,71 @@ namespace WebsitePanel.EnterpriseServer } #endregion + + #region Support Service Levels + + public static IDataReader GetSupportServiceLevels() + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetSupportServiceLevels"); + } + + public static int AddSupportServiceLevel(string levelName, string levelDescription) + { + SqlParameter outParam = new SqlParameter("@LevelID", SqlDbType.Int); + outParam.Direction = ParameterDirection.Output; + + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "AddSupportServiceLevel", + outParam, + new SqlParameter("@LevelName", levelName), + new SqlParameter("@LevelDescription", levelDescription) + ); + + return Convert.ToInt32(outParam.Value); + } + + public static void UpdateSupportServiceLevel(int levelID, string levelName, string levelDescription) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateSupportServiceLevel", + new SqlParameter("@LevelID", levelID), + new SqlParameter("@LevelName", levelName), + new SqlParameter("@LevelDescription", levelDescription) + ); + } + + public static void DeleteSupportServiceLevel(int levelID) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "DeleteSupportServiceLevel", + new SqlParameter("@LevelID", levelID) + ); + } + + public static IDataReader GetSupportServiceLevel(int levelID) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetSupportServiceLevel", + new SqlParameter("@LevelID", levelID) + ); + } + + public static bool CheckServiceLevelUsage(int levelID) + { + int res = (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "CheckServiceLevelUsage", + new SqlParameter("@LevelID", levelID)); + return res > 0; + } + + #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs index 52e1dc03..cd3cb5d5 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs @@ -978,6 +978,31 @@ namespace WebsitePanel.EnterpriseServer List accounts = new List(); ObjectUtils.FillCollectionFromDataView(accounts, ds.Tables[1].DefaultView); + + Organization org = null; + try + { + org = GetOrganization(itemId); + + if (org != null) + { + Organizations orgProxy = OrganizationController.GetOrganizationProxy(org.ServiceId); + + OrganizationUser user = null; + string accountName = string.Empty; + foreach (var account in accounts) + { + accountName = OrganizationController.GetAccountName(account.AccountName); + + user = orgProxy.GetUserGeneralSettings(accountName, org.OrganizationId); + + account.Disabled = user.Disabled; + account.Locked = user.Locked; + } + } + } + catch { } + result.PageItems = accounts.ToArray(); return result; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index 0bde22d7..97f29adf 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -1856,6 +1856,8 @@ namespace WebsitePanel.EnterpriseServer retUser.IsLyncUser = DataProvider.CheckLyncUserExists(accountId); retUser.IsBlackBerryUser = BlackBerryController.CheckBlackBerryUserExists(accountId); retUser.SubscriberNumber = account.SubscriberNumber; + retUser.LevelId = account.LevelId; + retUser.IsVIP = account.IsVIP; return retUser; } @@ -1873,7 +1875,7 @@ namespace WebsitePanel.EnterpriseServer string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes, string externalEmail, string subscriberNumber) + string webPage, string notes, string externalEmail, string subscriberNumber, int levelId, bool isVIP) { // check account @@ -1940,6 +1942,8 @@ namespace WebsitePanel.EnterpriseServer // update account account.DisplayName = displayName; account.SubscriberNumber = subscriberNumber; + account.LevelId = levelId; + account.IsVIP = isVIP; //account. if (!String.IsNullOrEmpty(password)) @@ -1948,6 +1952,7 @@ namespace WebsitePanel.EnterpriseServer account.AccountPassword = null; UpdateAccount(account); + UpdateAccountServiceLevelSettings(account); return 0; @@ -2114,7 +2119,10 @@ namespace WebsitePanel.EnterpriseServer } } - + private static void UpdateAccountServiceLevelSettings(ExchangeAccount account) + { + DataProvider.UpdateExchangeAccountServiceLevelSettings(account.AccountId, account.LevelId, account.IsVIP); + } private static void UpdateAccount(ExchangeAccount account) { @@ -2126,7 +2134,6 @@ namespace WebsitePanel.EnterpriseServer } - public static List SearchAccounts(int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) @@ -2941,5 +2948,122 @@ namespace WebsitePanel.EnterpriseServer //return accounts; } + + + #region Service Levels + + public static int AddSupportServiceLevel(string levelName, string levelDescription) + { + if (string.IsNullOrEmpty(levelName)) + throw new ArgumentNullException("levelName"); + + // place log record + TaskManager.StartTask("ORGANIZATION", "ADD_SUPPORT_SERVICE_LEVEL"); + + int levelID = 0; + + try + { + levelID = DataProvider.AddSupportServiceLevel(levelName, levelDescription); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return levelID; + } + + public static ResultObject DeleteSupportServiceLevel(int levelId) + { + ResultObject res = TaskManager.StartResultTask("ORGANIZATION", "DELETE_SUPPORT_SERVICE_LEVEL", levelId); + + try + { + if (CheckServiceLevelUsage(levelId)) res.AddError("SERVICE_LEVEL_IN_USE", new ApplicationException("Service Level is being used")); + + if (res.IsSuccess) + DataProvider.DeleteSupportServiceLevel(levelId); + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + TaskManager.CompleteResultTask(res); + res.AddError("", ex); + return res; + } + + TaskManager.CompleteResultTask(); + return res; + } + + public static void UpdateSupportServiceLevel(int levelID, string levelName, string levelDescription) + { + // place log record + TaskManager.StartTask("ORGANIZATION", "UPDATE_SUPPORT_SERVICE_LEVEL", levelID); + + try + { + DataProvider.UpdateSupportServiceLevel(levelID, levelName, levelDescription); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ServiceLevel[] GetSupportServiceLevels() + { + // place log record + TaskManager.StartTask("ORGANIZATION", "GET_SUPPORT_SERVICE_LEVELS"); + + try + { + return ObjectUtils.CreateListFromDataReader(DataProvider.GetSupportServiceLevels()).ToArray(); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + public static ServiceLevel GetSupportServiceLevel(int levelID) + { + // place log record + TaskManager.StartTask("ORGANIZATION", "GET_SUPPORT_SERVICE_LEVEL", levelID); + + try + { + return ObjectUtils.FillObjectFromDataReader( + DataProvider.GetSupportServiceLevel(levelID)); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + + private static bool CheckServiceLevelUsage(int levelID) + { + return DataProvider.CheckServiceLevelUsage(levelID); + } + + #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs index 74098095..3f30bf31 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs @@ -31,6 +31,7 @@ using System.ComponentModel; using System.Data; using System.Web.Services; using WebsitePanel.EnterpriseServer.Base.HostedSolution; +using WebsitePanel.Providers.Common; using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.ResultObjects; @@ -194,14 +195,14 @@ namespace WebsitePanel.EnterpriseServer string lastName, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string managerAccountName, string businessPhone, string fax, string homePhone, string mobilePhone, string pager, - string webPage, string notes, string externalEmail, string subscriberNumber) + string webPage, string notes, string externalEmail, string subscriberNumber, int levelId, bool isVIP) { return OrganizationController.SetUserGeneralSettings(itemId, accountId, displayName, password, hideAddressBook, disabled, locked, firstName, initials, lastName, address, city, state, zip, country, jobTitle, company, department, office, managerAccountName, businessPhone, fax, homePhone, mobilePhone, pager, - webPage, notes, externalEmail, subscriberNumber); + webPage, notes, externalEmail, subscriberNumber, levelId, isVIP); } @@ -335,5 +336,39 @@ namespace WebsitePanel.EnterpriseServer #endregion + #region Service Levels + + [WebMethod] + public ServiceLevel[] GetSupportServiceLevels() + { + return OrganizationController.GetSupportServiceLevels(); + } + + [WebMethod] + public void UpdateSupportServiceLevel(int levelID, string levelName, string levelDescription) + { + OrganizationController.UpdateSupportServiceLevel(levelID, levelName, levelDescription); + } + + [WebMethod] + public ResultObject DeleteSupportServiceLevel(int levelId) + { + return OrganizationController.DeleteSupportServiceLevel(levelId); + } + + [WebMethod] + public int AddSupportServiceLevel(string levelName, string levelDescription) + { + return OrganizationController.AddSupportServiceLevel(levelName, levelDescription); + } + + [WebMethod] + public ServiceLevel GetSupportServiceLevel(int levelID) + { + return OrganizationController.GetSupportServiceLevel(levelID); + } + + #endregion + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs index ebcf44fa..f051a824 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ExchangeAccount.cs @@ -51,6 +51,8 @@ namespace WebsitePanel.Providers.HostedSolution string publicFolderPermission; string userPrincipalName; string notes; + int levelId; + bool isVip; public int AccountId { @@ -177,6 +179,20 @@ namespace WebsitePanel.Providers.HostedSolution set { this.enableArchiving = value; } } - + public bool IsVIP + { + get { return this.isVip; } + set { this.isVip = value; } + } + + public int LevelId + { + get { return this.levelId; } + set { this.levelId = value; } + } + + public bool Disabled { get; set; } + + public bool Locked { get; set; } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs index 8c474b99..a98ba23d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationUser.cs @@ -77,6 +77,8 @@ namespace WebsitePanel.Providers.HostedSolution private OrganizationUser manager; private Guid crmUserId; + private int levelId; + private bool isVip; public Guid CrmUserId { @@ -313,5 +315,17 @@ namespace WebsitePanel.Providers.HostedSolution } + public int LevelId + { + get { return levelId; } + set { levelId = value; } + } + + public bool IsVIP + { + get { return isVip; } + set { isVip = value; } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index 1976376c..72400db0 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -3219,7 +3219,7 @@ Invalid recoverable items quota specified, should be greater or equal to 6144MB - + Calculate organization disk space @@ -5572,4 +5572,16 @@ Tasks + + Service Levels + + + Service Level with this name is already exists + + + Delete Service Level Error + + + Unable to remove Service Level because it is being used + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsServiceLevels.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsServiceLevels.ascx.resx new file mode 100644 index 00000000..e7b3fd67 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsServiceLevels.ascx.resx @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add New + + + No service levels have been added yet. To add a new service level set params and click "Add New" button. + + + Please enter service level name + + + * + + + Update + + + Description: + + + Name: + + + Service Level + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx index 88e2ac28..69f57eb1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/UserAccountPolicySettings.ascx.resx @@ -150,4 +150,7 @@ WEB Policy + + Service Levels + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx index 6b4a1ba2..89372cb3 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/ExchangeMailboxes.ascx.resx @@ -177,4 +177,7 @@ Archiving Mailboxes + + Service Level + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx index fb511e76..b21e975e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUserGeneralSettings.ascx.resx @@ -246,4 +246,13 @@ Update Services + + Service Level: + + + VIP: + + + Service Level Information + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx index 69a7581f..8be5e282 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationUsers.ascx.resx @@ -180,4 +180,7 @@ Login + + Service Level + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs index d0d54618..b91a1f73 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeCreateMailbox.ascx.cs @@ -213,7 +213,9 @@ namespace WebsitePanel.Portal.ExchangeServer null, null, user.ExternalEmail, - txtSubscriberNumber.Text); + txtSubscriberNumber.Text, + 0, + false); } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx index c9738e64..9425e414 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx @@ -52,10 +52,16 @@ OnRowCommand="gvMailboxes_RowCommand" AllowPaging="True" AllowSorting="True" DataSourceID="odsAccountsPaged" PageSize="20"> + + + + + - + - + + <%# Eval("DisplayName") %> @@ -63,7 +69,7 @@ - + @@ -71,6 +77,14 @@ + + + + + <%# GetServiceLevel((int)Eval("LevelId")).LevelName%> + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.cs index 76a277a7..4764dd12 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.cs @@ -27,9 +27,11 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Linq; using System.Web.UI.WebControls; using WebsitePanel.Providers.HostedSolution; using WebsitePanel.EnterpriseServer; +using WebsitePanel.EnterpriseServer.Base.HostedSolution; namespace WebsitePanel.Portal.ExchangeServer { @@ -43,6 +45,8 @@ namespace WebsitePanel.Portal.ExchangeServer } } + private ServiceLevel[] ServiceLevels; + protected void Page_Load(object sender, EventArgs e) { locTitle.Text = ArchivingBoxes ? GetLocalizedString("locTitleArchiving.Text") : GetLocalizedString("locTitle.Text"); @@ -54,14 +58,23 @@ namespace WebsitePanel.Portal.ExchangeServer BindStats(); } + BindServiceLevels(); + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_ISCONSUMER)) { if (cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue != 1) { - gvMailboxes.Columns[3].Visible = false; + gvMailboxes.Columns[4].Visible = false; } } + + gvMailboxes.Columns[3].Visible = cntx.Groups.ContainsKey(ResourceGroups.ServiceLevels); + } + + private void BindServiceLevels() + { + ServiceLevels = ES.Services.Organizations.GetSupportServiceLevels(); } private void BindStats() @@ -96,7 +109,7 @@ namespace WebsitePanel.Portal.ExchangeServer } } - public string GetAccountImage(int accountTypeId) + public string GetAccountImage(int accountTypeId, bool vip) { ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; string imgName = "mailbox_16.gif"; @@ -109,6 +122,21 @@ namespace WebsitePanel.Portal.ExchangeServer else if (accountType == ExchangeAccountType.Equipment) imgName = "equipment_16.gif"; + if (vip) imgName = "admin_16.png"; + + return GetThemedImage("Exchange/" + imgName); + } + + public string GetStateImage(bool locked, bool disabled) + { + string imgName = "enabled.png"; + + if (locked) + imgName = "locked.png"; + else + if (disabled) + imgName = "disabled.png"; + return GetThemedImage("Exchange/" + imgName); } @@ -166,5 +194,10 @@ namespace WebsitePanel.Portal.ExchangeServer { e.InputParameters["archiving"] = ArchivingBoxes; } + + public ServiceLevel GetServiceLevel(int levelId) + { + return ServiceLevels.Where(x => x.LevelId == levelId).DefaultIfEmpty(new ServiceLevel { LevelName = "", LevelDescription = "" }).FirstOrDefault(); + } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.designer.cs index a201e1c7..e9cf4b0a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/ExchangeMailboxes.ascx.designer.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2014, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs index a5b3832c..8550eab8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateUser.ascx.cs @@ -167,7 +167,9 @@ namespace WebsitePanel.Portal.HostedSolution null, null, user.ExternalEmail, - txtSubscriberNumber.Text); + txtSubscriberNumber.Text, + 0, + false); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx index c8c61523..44df243e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx @@ -117,12 +117,34 @@ - + + + + + + + + + + + + + + +
+ +
+ +
+
+ + @@ -207,6 +229,7 @@ +
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs index 18a5440b..b8c6c70c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationUserGeneralSettings.ascx.cs @@ -27,8 +27,11 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Collections.Generic; +using System.Linq; using System.Web.UI.WebControls; using WebsitePanel.EnterpriseServer; +using WebsitePanel.EnterpriseServer.Base.HostedSolution; using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.ResultObjects; @@ -40,6 +43,8 @@ namespace WebsitePanel.Portal.HostedSolution { if (!IsPostBack) { + BindServiceLevels(); + BindSettings(); MailboxTabsId.Visible = (PanelRequest.Context == "Mailbox"); @@ -81,6 +86,18 @@ namespace WebsitePanel.Portal.HostedSolution txtInitials.Text = user.Initials; txtLastName.Text = user.LastName; + if (user.LevelId > 0 && secServiceLevels.Visible) + { + ServiceLevel serviceLevel = ES.Services.Organizations.GetSupportServiceLevel(user.LevelId); + + if (ddlServiceLevels.Items.FindByValue(serviceLevel.LevelId.ToString()) == null) + ddlServiceLevels.Items.Add(new ListItem(serviceLevel.LevelName, serviceLevel.LevelId.ToString())); + + ddlServiceLevels.Items.FindByValue(string.Empty).Selected = false; + ddlServiceLevels.Items.FindByValue(serviceLevel.LevelId.ToString()).Selected = true; + } + chkVIP.Checked = user.IsVIP && secServiceLevels.Visible; + txtJobTitle.Text = user.JobTitle; txtCompany.Text = user.Company; txtDepartment.Text = user.Department; @@ -196,6 +213,51 @@ namespace WebsitePanel.Portal.HostedSolution } } + private void BindServiceLevels() + { + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + + if (cntx.Groups.ContainsKey(ResourceGroups.ServiceLevels)) + { + List enabledServiceLevels = new List(); + + foreach (var quota in cntx.Quotas.Where(x => x.Key.Contains(Quotas.SERVICE_LEVELS))) + { + foreach (var serviceLevel in ES.Services.Organizations.GetSupportServiceLevels()) + { + if (quota.Key.Replace(Quotas.SERVICE_LEVELS, "") == serviceLevel.LevelName && CheckServiceLevelQuota(quota.Value, serviceLevel.LevelId)) + { + enabledServiceLevels.Add(serviceLevel); + } + } + } + + ddlServiceLevels.DataSource = enabledServiceLevels; + ddlServiceLevels.DataTextField = "LevelName"; + ddlServiceLevels.DataValueField = "LevelId"; + ddlServiceLevels.DataBind(); + + ddlServiceLevels.Items.Insert(0, new ListItem("
+ + + + + + + + +
+ + + + +
+ + +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.cs new file mode 100644 index 00000000..d353f97f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.cs @@ -0,0 +1,176 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +using System; +using System.IO; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Xml; +using System.Xml.Serialization; + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; + +using WebsitePanel.EnterpriseServer; +using WebsitePanel.EnterpriseServer.Base.HostedSolution; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.ResultObjects; +using WebsitePanel.Providers.Common; + +namespace WebsitePanel.Portal +{ + public partial class SettingsServiceLevels : WebsitePanelControlBase, IUserSettingsEditorControl + { + + + public void BindSettings(UserSettings settings) + { + if (PanelSecurity.SelectedUser.Role == UserRole.Administrator) + BindServiceLevels(); + + txtStatus.Visible = false; + } + + + private void BindServiceLevels() + { + ServiceLevel[] array = ES.Services.Organizations.GetSupportServiceLevels(); + + gvServiceLevels.DataSource = array; + gvServiceLevels.DataBind(); + + btnAddServiceLevel.Enabled = (string.IsNullOrEmpty(txtServiceLevelName.Text)) ? true : false; + btnUpdateServiceLevel.Enabled = (string.IsNullOrEmpty(txtServiceLevelName.Text)) ? false : true; + } + + + public void btnAddServiceLevel_Click(object sender, EventArgs e) + { + Page.Validate("CreateServiceLevel"); + + if (!Page.IsValid) + return; + + ServiceLevel serviceLevel = new ServiceLevel(); + + int res = ES.Services.Organizations.AddSupportServiceLevel(txtServiceLevelName.Text, txtServiceLevelDescr.Text); + + if (res < 0) + { + messageBox.ShowErrorMessage("ADD_SERVICE_LEVEL"); + + return; + } + + txtServiceLevelName.Text = string.Empty; + txtServiceLevelDescr.Text = string.Empty; + + BindServiceLevels(); + } + + + protected void gvServiceLevels_RowCommand(object sender, GridViewCommandEventArgs e) + { + int levelID = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + switch (e.CommandName) + { + case "DeleteItem": + + ResultObject result = ES.Services.Organizations.DeleteSupportServiceLevel(levelID); + + if (!result.IsSuccess) + { + if (result.ErrorCodes.Contains("SERVICE_LEVEL_IN_USE:Service Level is being used; ")) messageBox.ShowErrorMessage("SERVICE_LEVEL_IN_USE"); + else messageBox.ShowMessage(result, "DELETE_SERVICE_LEVEL", null); + + return; + } + + ViewState["ServiceLevelID"] = null; + + txtServiceLevelName.Text = string.Empty; + txtServiceLevelDescr.Text = string.Empty; + + BindServiceLevels(); + break; + + case "EditItem": + ServiceLevel serviceLevel; + + ViewState["ServiceLevelID"] = levelID; + + serviceLevel = ES.Services.Organizations.GetSupportServiceLevel(levelID); + + txtServiceLevelName.Text = serviceLevel.LevelName; + txtServiceLevelDescr.Text = serviceLevel.LevelDescription; + + btnUpdateServiceLevel.Enabled = (string.IsNullOrEmpty(txtServiceLevelName.Text)) ? false : true; + btnAddServiceLevel.Enabled = (string.IsNullOrEmpty(txtServiceLevelName.Text)) ? true : false; + break; + } + } + + + public void SaveSettings(UserSettings settings) + { + settings["ServiceLevels"] = ""; + } + + + protected void btnUpdateServiceLevel_Click(object sender, EventArgs e) + { + Page.Validate("CreateServiceLevel"); + + if (!Page.IsValid) + return; + + if (ViewState["ServiceLevelID"] == null) + return; + + int levelID = (int)ViewState["ServiceLevelID"]; + + ES.Services.Organizations.UpdateSupportServiceLevel(levelID, txtServiceLevelName.Text, txtServiceLevelDescr.Text); + + txtServiceLevelName.Text = string.Empty; + txtServiceLevelDescr.Text = string.Empty; + + BindServiceLevels(); + } + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.designer.cs new file mode 100644 index 00000000..ad3fe950 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsServiceLevels.ascx.designer.cs @@ -0,0 +1,132 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal { + + + public partial class SettingsServiceLevels { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// gvServiceLevels control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvServiceLevels; + + /// + /// secServiceLevel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secServiceLevel; + + /// + /// ServiceLevel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel ServiceLevel; + + /// + /// lblServiceLevelName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblServiceLevelName; + + /// + /// txtServiceLevelName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtServiceLevelName; + + /// + /// valRequireServiceLevelName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireServiceLevelName; + + /// + /// lblServiceLevelDescr control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblServiceLevelDescr; + + /// + /// txtServiceLevelDescr control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtServiceLevelDescr; + + /// + /// btnAddServiceLevel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddServiceLevel; + + /// + /// btnUpdateServiceLevel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnUpdateServiceLevel; + + /// + /// txtStatus control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtStatus; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotasControl.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotasControl.ascx index dd82036b..2c94c5ff 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotasControl.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SpaceQuotasControl.ascx @@ -13,7 +13,7 @@
- <%# GetSharedLocalizedString("Quota." + (string)Eval("QuotaName"))%>: + <%# GetQuotaTitle((string)Eval("QuotaName"), (string)Eval("QuotaDescription"))%>:
// This code was generated by a tool. diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx index 4027111c..1ea55968 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx @@ -5,6 +5,10 @@ +
  • + +
  • diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs index 90082428..52a6d8b6 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserAccountPolicySettings.ascx.designer.cs @@ -1,32 +1,3 @@ -// Copyright (c) 2014, Outercurve Foundation. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -50,6 +21,15 @@ namespace WebsitePanel.Portal { /// protected global::System.Web.UI.WebControls.HyperLink lnkWebsitePanelPolicy; + /// + /// lnkServiceLevels control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink lnkServiceLevels; + /// /// lnkWebPolicy control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 3097e2bc..62d05d26 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -210,6 +210,13 @@ + + SettingsServiceLevels.ascx + ASPXCodeBehind + + + SettingsServiceLevels.ascx + CRMStorageSettings.ascx ASPXCodeBehind @@ -4138,6 +4145,7 @@ + @@ -5421,6 +5429,7 @@ + Designer