diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 527e04d6..0d98ef0e 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -2745,3 +2745,38 @@ BEGIN INSERT [dbo].[Quotas] ([QuotaID], [GroupID],[QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID]) VALUES (462, 21, 4, N'HostedCRM.ESSUsers', N'ESS licenses per organization',3, 0 , NULL) END GO + + +-- Lync + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetPackageIPAddressesCount') +DROP PROCEDURE GetPackageIPAddressesCount +GO + + PROCEDURE [dbo].[GetPackageIPAddressesCount] +( + @PackageID int, + @OrgID int, + @PoolID int = 0 +) +AS +BEGIN + +SELECT + COUNT(PA.PackageAddressID) +FROM + dbo.PackageIPAddresses PA +INNER JOIN + dbo.IPAddresses AS IP ON PA.AddressID = IP.AddressID +INNER JOIN + dbo.Packages P ON PA.PackageID = P.PackageID +INNER JOIN + dbo.Users U ON U.UserID = P.UserID +LEFT JOIN + ServiceItems SI ON PA.ItemId = SI.ItemID +WHERE + (@PoolID = 0 OR @PoolID <> 0 AND IP.PoolID = @PoolID) +AND (@OrgID = 0 OR @OrgID <> 0 AND PA.OrgID = @OrgID) + +END + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ServersProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ServersProxy.cs index 0787ef27..52065e46 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ServersProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/ServersProxy.cs @@ -52,8 +52,8 @@ using WebsitePanel.Server; using WebsitePanel.Providers.DNS; using WebsitePanel.Providers.ResultObjects; -namespace WebsitePanel.EnterpriseServer { - +namespace WebsitePanel.EnterpriseServer +{ /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] @@ -61,6 +61,8 @@ namespace WebsitePanel.EnterpriseServer { [System.Web.Services.WebServiceBindingAttribute(Name="esServersSoap", Namespace="http://smbsaas/websitepanel/enterpriseserver")] public partial class esServers : Microsoft.Web.Services3.WebServicesClientProtocol { + private System.Threading.SendOrPostCallback GetDnsRecordsByServiceOperationCompleted; + private System.Threading.SendOrPostCallback GetDnsRecordsByServerOperationCompleted; private System.Threading.SendOrPostCallback GetDnsRecordsByPackageOperationCompleted; @@ -269,6 +271,8 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback GetPackageIPAddressesOperationCompleted; + private System.Threading.SendOrPostCallback GetPackageIPAddressesCountOperationCompleted; + private System.Threading.SendOrPostCallback GetPackageUnassignedIPAddressesOperationCompleted; private System.Threading.SendOrPostCallback AllocatePackageIPAddressesOperationCompleted; @@ -291,13 +295,14 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback GetRawDnsRecordsByGroupOperationCompleted; - private System.Threading.SendOrPostCallback GetDnsRecordsByServiceOperationCompleted; - /// public esServers() { this.Url = "http://localhost:9002/esServers.asmx"; } + /// + public event GetDnsRecordsByServiceCompletedEventHandler GetDnsRecordsByServiceCompleted; + /// public event GetDnsRecordsByServerCompletedEventHandler GetDnsRecordsByServerCompleted; @@ -610,6 +615,9 @@ namespace WebsitePanel.EnterpriseServer { /// public event GetPackageIPAddressesCompletedEventHandler GetPackageIPAddressesCompleted; + /// + public event GetPackageIPAddressesCountCompletedEventHandler GetPackageIPAddressesCountCompleted; + /// public event GetPackageUnassignedIPAddressesCompletedEventHandler GetPackageUnassignedIPAddressesCompleted; @@ -644,7 +652,45 @@ namespace WebsitePanel.EnterpriseServer { public event GetRawDnsRecordsByGroupCompletedEventHandler GetRawDnsRecordsByGroupCompleted; /// - public event GetDnsRecordsByServiceCompletedEventHandler GetDnsRecordsByServiceCompleted; + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDnsRecordsByService", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public GlobalDnsRecord[] GetDnsRecordsByService(int serviceId) { + object[] results = this.Invoke("GetDnsRecordsByService", new object[] { + serviceId}); + return ((GlobalDnsRecord[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetDnsRecordsByService(int serviceId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetDnsRecordsByService", new object[] { + serviceId}, callback, asyncState); + } + + /// + public GlobalDnsRecord[] EndGetDnsRecordsByService(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((GlobalDnsRecord[])(results[0])); + } + + /// + public void GetDnsRecordsByServiceAsync(int serviceId) { + this.GetDnsRecordsByServiceAsync(serviceId, null); + } + + /// + public void GetDnsRecordsByServiceAsync(int serviceId, object userState) { + if ((this.GetDnsRecordsByServiceOperationCompleted == null)) { + this.GetDnsRecordsByServiceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetDnsRecordsByServiceOperationCompleted); + } + this.InvokeAsync("GetDnsRecordsByService", new object[] { + serviceId}, this.GetDnsRecordsByServiceOperationCompleted, userState); + } + + private void OnGetDnsRecordsByServiceOperationCompleted(object arg) { + if ((this.GetDnsRecordsByServiceCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetDnsRecordsByServiceCompleted(this, new GetDnsRecordsByServiceCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDnsRecordsByServer", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -5196,6 +5242,53 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPackageIPAddressesCount", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int GetPackageIPAddressesCount(int packageId, int orgId, IPAddressPool pool) { + object[] results = this.Invoke("GetPackageIPAddressesCount", new object[] { + packageId, + orgId, + pool}); + return ((int)(results[0])); + } + + /// + public System.IAsyncResult BeginGetPackageIPAddressesCount(int packageId, int orgId, IPAddressPool pool, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetPackageIPAddressesCount", new object[] { + packageId, + orgId, + pool}, callback, asyncState); + } + + /// + public int EndGetPackageIPAddressesCount(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((int)(results[0])); + } + + /// + public void GetPackageIPAddressesCountAsync(int packageId, int orgId, IPAddressPool pool) { + this.GetPackageIPAddressesCountAsync(packageId, orgId, pool, null); + } + + /// + public void GetPackageIPAddressesCountAsync(int packageId, int orgId, IPAddressPool pool, object userState) { + if ((this.GetPackageIPAddressesCountOperationCompleted == null)) { + this.GetPackageIPAddressesCountOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPackageIPAddressesCountOperationCompleted); + } + this.InvokeAsync("GetPackageIPAddressesCount", new object[] { + packageId, + orgId, + pool}, this.GetPackageIPAddressesCountOperationCompleted, userState); + } + + private void OnGetPackageIPAddressesCountOperationCompleted(object arg) { + if ((this.GetPackageIPAddressesCountCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPackageIPAddressesCountCompleted(this, new GetPackageIPAddressesCountCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetPackageUnassignedIPAddresses", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public PackageIPAddress[] GetPackageUnassignedIPAddresses(int packageId, int orgId, IPAddressPool pool) { @@ -5677,53 +5770,38 @@ namespace WebsitePanel.EnterpriseServer { } } - /// - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDnsRecordsByService", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public GlobalDnsRecord[] GetDnsRecordsByService(int serviceId) { - object[] results = this.Invoke("GetDnsRecordsByService", new object[] { - serviceId}); - return ((GlobalDnsRecord[])(results[0])); - } - - /// - public System.IAsyncResult BeginGetDnsRecordsByService(int serviceId, System.AsyncCallback callback, object asyncState) { - return this.BeginInvoke("GetDnsRecordsByService", new object[] { - serviceId}, callback, asyncState); - } - - /// - public GlobalDnsRecord[] EndGetDnsRecordsByService(System.IAsyncResult asyncResult) { - object[] results = this.EndInvoke(asyncResult); - return ((GlobalDnsRecord[])(results[0])); - } - - /// - public void GetDnsRecordsByServiceAsync(int serviceId) { - this.GetDnsRecordsByServiceAsync(serviceId, null); - } - - /// - public void GetDnsRecordsByServiceAsync(int serviceId, object userState) { - if ((this.GetDnsRecordsByServiceOperationCompleted == null)) { - this.GetDnsRecordsByServiceOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetDnsRecordsByServiceOperationCompleted); - } - this.InvokeAsync("GetDnsRecordsByService", new object[] { - serviceId}, this.GetDnsRecordsByServiceOperationCompleted, userState); - } - - private void OnGetDnsRecordsByServiceOperationCompleted(object arg) { - if ((this.GetDnsRecordsByServiceCompleted != null)) { - System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); - this.GetDnsRecordsByServiceCompleted(this, new GetDnsRecordsByServiceCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); - } - } - /// public new void CancelAsync(object userState) { base.CancelAsync(userState); } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetDnsRecordsByServiceCompletedEventHandler(object sender, GetDnsRecordsByServiceCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetDnsRecordsByServiceCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetDnsRecordsByServiceCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public GlobalDnsRecord[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((GlobalDnsRecord[])(this.results[0])); + } + } + } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] public delegate void GetDnsRecordsByServerCompletedEventHandler(object sender, GetDnsRecordsByServerCompletedEventArgs e); @@ -8340,6 +8418,32 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + public delegate void GetPackageIPAddressesCountCompletedEventHandler(object sender, GetPackageIPAddressesCountCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPackageIPAddressesCountCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPackageIPAddressesCountCompletedEventArgs(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.42")] public delegate void GetPackageUnassignedIPAddressesCompletedEventHandler(object sender, GetPackageUnassignedIPAddressesCompletedEventArgs e); @@ -8625,30 +8729,4 @@ namespace WebsitePanel.EnterpriseServer { } } } - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void GetDnsRecordsByServiceCompletedEventHandler(object sender, GetDnsRecordsByServiceCompletedEventArgs e); - - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetDnsRecordsByServiceCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { - - private object[] results; - - internal GetDnsRecordsByServiceCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) { - this.results = results; - } - - /// - public GlobalDnsRecord[] Result { - get { - this.RaiseExceptionIfNecessary(); - return ((GlobalDnsRecord[])(this.results[0])); - } - } - } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index d2caa067..07a052cb 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -3286,6 +3286,17 @@ namespace WebsitePanel.EnterpriseServer return reader; } + public static int GetPackageIPAddressesCount(int packageId, int orgId, int poolId) + { + object obj = SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, + "GetPackageIPAddressesCount", + new SqlParameter("@PackageID", packageId), + new SqlParameter("@OrgID", orgId), + new SqlParameter("@PoolId", poolId)); + int res = 0; + int.TryParse(obj.ToString(), out res); + return res; + } public static void DeallocatePackageIPAddress(int id) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs index 248730f1..b759177c 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs @@ -1186,6 +1186,11 @@ namespace WebsitePanel.EnterpriseServer return result; } + public static int GetPackageIPAddressesCount(int packageId, int orgId, IPAddressPool pool) + { + return DataProvider.GetPackageIPAddressesCount(packageId, orgId, (int)pool); + } + public static List GetUnallottedIPAddresses(int packageId, string groupName, IPAddressPool pool) { // get service ID @@ -1259,6 +1264,9 @@ namespace WebsitePanel.EnterpriseServer int quotaAllocated = cntx.Quotas[quotaName].QuotaAllocatedValue; int quotaUsed = cntx.Quotas[quotaName].QuotaUsedValue; + if (pool == IPAddressPool.PhoneNumbers) + quotaUsed = ServerController.GetPackageIPAddressesCount(packageId, orgId, pool); + // check the maximum allowed number if (quotaAllocated != -1) // check only if not unlimited { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esServers.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esServers.asmx.cs index bde7c636..312a78b8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esServers.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esServers.asmx.cs @@ -393,6 +393,12 @@ namespace WebsitePanel.EnterpriseServer filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive); } + [WebMethod] + public int GetPackageIPAddressesCount(int packageId, int orgId, IPAddressPool pool) + { + return ServerController.GetPackageIPAddressesCount(packageId, orgId, pool); + } + [WebMethod] public List GetPackageUnassignedIPAddresses(int packageId, int orgId, IPAddressPool pool) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncPhoneNumbers.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncPhoneNumbers.ascx.cs index 4cb22840..2418fa64 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncPhoneNumbers.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/LyncPhoneNumbers.ascx.cs @@ -31,6 +31,8 @@ using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; +using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.Common; namespace WebsitePanel.Portal.Lync { @@ -38,6 +40,15 @@ namespace WebsitePanel.Portal.Lync { protected void Page_Load(object sender, EventArgs e) { + + } + + protected void Page_PreRender(object sender, EventArgs e) + { + if (!IsPostBack) + { + phoneQuota.Viewer.QuotaUsedValue = ES.Services.Servers.GetPackageIPAddressesCount(PanelSecurity.PackageId, PanelRequest.ItemID, IPAddressPool.PhoneNumbers); + } } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/AllocatePackagePhoneNumbers.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/AllocatePackagePhoneNumbers.ascx.cs index 6240c896..b471307a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/AllocatePackagePhoneNumbers.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Lync/UserControls/AllocatePackagePhoneNumbers.ascx.cs @@ -95,7 +95,9 @@ namespace WebsitePanel.Portal.UserControls if (cntx.Quotas.ContainsKey(quotaName)) { int quotaAllocated = cntx.Quotas[quotaName].QuotaAllocatedValue; - int quotaUsed = cntx.Quotas[quotaName].QuotaUsedValue; + //int quotaUsed = cntx.Quotas[quotaName].QuotaUsedValue; + + int quotaUsed = ES.Services.Servers.GetPackageIPAddressesCount(PanelSecurity.PackageId, PanelRequest.ItemID, IPAddressPool.PhoneNumbers); if (quotaAllocated != -1) quotaAllowed = quotaAllocated - quotaUsed; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserControls/Quota.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserControls/Quota.ascx.cs index 0931504d..da96d14a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserControls/Quota.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserControls/Quota.ascx.cs @@ -55,6 +55,11 @@ namespace WebsitePanel.Portal set { quotaViewer.DisplayGauge = value; } } + public QuotaViewer Viewer + { + get { return quotaViewer; } + } + protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack)