diff --git a/framework/quota/src/org/apache/cloudstack/quota/QuotaStatement.java b/framework/quota/src/org/apache/cloudstack/quota/QuotaStatement.java index 711abcfbe59..e6f5e25eaea 100644 --- a/framework/quota/src/org/apache/cloudstack/quota/QuotaStatement.java +++ b/framework/quota/src/org/apache/cloudstack/quota/QuotaStatement.java @@ -16,8 +16,11 @@ //under the License. package org.apache.cloudstack.quota; +import java.util.Calendar; + import com.cloud.utils.component.Manager; public interface QuotaStatement extends Manager { void sendStatement(); + Calendar[] getCurrentStatementTime(); } diff --git a/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java b/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java index cde3e5af064..64e105c4b4d 100644 --- a/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java +++ b/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java @@ -143,6 +143,122 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { } } + @Override + public Calendar[] getCurrentStatementTime() { + final Calendar today = Calendar.getInstance(); + int day_of_month = today.get(Calendar.DAY_OF_MONTH); + int month_of_year = today.get(Calendar.MONTH); + + Calendar firstDateOfCurrentPeriod, lastDateOfCurrentPeriod; + Calendar aCalendar = (Calendar)today.clone(); + aCalendar.add(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + lastDateOfCurrentPeriod = aCalendar; + + switch (_period) { + case BIMONTHLY: + if (day_of_month < 16) { + aCalendar = (Calendar)today.clone(); + aCalendar.add(Calendar.MONTH, 0); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } else { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.DATE, 16); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } + case MONTHLY: + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + case QUATERLY: + if (month_of_year < Calendar.APRIL) { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.MONTH, Calendar.JANUARY); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } else if (month_of_year < Calendar.JULY) { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.MONTH, Calendar.APRIL); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } else if (month_of_year < Calendar.OCTOBER) { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.MONTH, Calendar.JULY); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } else { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.MONTH, Calendar.OCTOBER); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } + case HALFYEARLY: + // statements are sent in Jan=1, Jul 7, + if (month_of_year < Calendar.JULY) { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.MONTH, Calendar.JANUARY); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } else { + aCalendar = (Calendar)today.clone(); + aCalendar.set(Calendar.MONTH, Calendar.JULY); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + } + case YEARLY: + aCalendar = (Calendar)today.clone(); + aCalendar.add(Calendar.MONTH, Calendar.JANUARY); + aCalendar.set(Calendar.DATE, 1); + aCalendar.set(Calendar.HOUR, 0); + aCalendar.set(Calendar.MINUTE, 0); + aCalendar.set(Calendar.SECOND, 0); + firstDateOfCurrentPeriod = aCalendar; + return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod}; + default: + break; + } + return null; + } + public Calendar[] statementTime(final Calendar today, final STATEMENT_PERIODS period) { //check if it is statement time int day_of_month = today.get(Calendar.DAY_OF_MONTH); @@ -226,7 +342,7 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { return null; case YEARLY: // statements are sent in Jan=1 - if (month_of_year == Calendar.JANUARY ) { + if (month_of_year == Calendar.JANUARY) { if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) { Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, -12); diff --git a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java index d415f79c087..7deb00be506 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java +++ b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java @@ -16,8 +16,11 @@ //under the License. package org.apache.cloudstack.api.response; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; +import com.cloud.user.Account.State; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; @@ -30,12 +33,16 @@ import org.apache.cloudstack.api.command.QuotaStatementCmd; import org.apache.cloudstack.api.command.QuotaTariffListCmd; import org.apache.cloudstack.api.command.QuotaTariffUpdateCmd; import org.apache.cloudstack.quota.QuotaService; +import org.apache.cloudstack.quota.QuotaStatement; import org.apache.cloudstack.quota.constant.QuotaConfig; import org.apache.cloudstack.quota.constant.QuotaTypes; +import org.apache.cloudstack.quota.dao.QuotaAccountDao; import org.apache.cloudstack.quota.dao.QuotaBalanceDao; import org.apache.cloudstack.quota.dao.QuotaCreditsDao; import org.apache.cloudstack.quota.dao.QuotaEmailTemplatesDao; import org.apache.cloudstack.quota.dao.QuotaTariffDao; +import org.apache.cloudstack.quota.dao.QuotaUsageDao; +import org.apache.cloudstack.quota.vo.QuotaAccountVO; import org.apache.cloudstack.quota.vo.QuotaBalanceVO; import org.apache.cloudstack.quota.vo.QuotaCreditsVO; import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO; @@ -72,6 +79,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { @Inject private QuotaCreditsDao _quotaCreditsDao; @Inject + private QuotaUsageDao _quotaUsageDao; + @Inject private QuotaEmailTemplatesDao _quotaEmailTemplateDao; @Inject @@ -79,9 +88,15 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { @Inject private QuotaService _quotaService; @Inject - AccountDao _accountDao; + private AccountDao _accountDao; + @Inject + private DomainDao _domainDao; @Inject private RegionManager _regionMgr; + @Inject + private QuotaAccountDao _quotaAcc; + @Inject + private QuotaStatement _statement; @Override public QuotaTariffResponse createQuotaTariffResponse(QuotaTariffVO tariff) { @@ -100,6 +115,25 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { @Override public List createQuotaSummaryResponse() { List result = new ArrayList(); + Calendar[] period = _statement.getCurrentStatementTime(); + + for (final QuotaAccountVO quotaAccount : _quotaAcc.listAllQuotaAccount()) { + QuotaSummaryResponse qr = new QuotaSummaryResponse(); + AccountVO account = _accountDao.findById(quotaAccount.getId()); + DomainVO domain = _domainDao.findById(account.getDomainId()); + BigDecimal curBalance = _quotaBalanceDao.lastQuotaBalance(account.getAccountId(), account.getDomainId(), period[1].getTime()); + BigDecimal quotaUsage = _quotaUsageDao.findTotalQuotaUsage(account.getAccountId(), account.getDomainId(), null, period[0].getTime(), period[1].getTime()); + + qr.setAccountId(account.getAccountId()); + qr.setAccountName(account.getAccountName()); + qr.setDomainId(account.getDomainId()); + qr.setDomainName(domain.getName()); + qr.setBalance(curBalance); + qr.setQuotaUsage(quotaUsage); + qr.setState(account.getState().compareTo(State.enabled) == 0); + + result.add(qr); + } return result; } diff --git a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaSummaryResponse.java b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaSummaryResponse.java index ecb3df0d779..8c5e53a8ac9 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaSummaryResponse.java +++ b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaSummaryResponse.java @@ -36,14 +36,22 @@ public class QuotaSummaryResponse extends BaseResponse { @Param(description = "account name") private String accountName; - @SerializedName("domain") + @SerializedName("domainid") @Param(description = "domain id") private Long domainId; + @SerializedName("domain") + @Param(description = "domain name") + private String domainName; + @SerializedName("balance") @Param(description = "account balance") private BigDecimal balance; + @SerializedName("state") + @Param(description = "account state") + private Boolean state; + @SerializedName("quota") @Param(description = "quota usage of this period") private BigDecimal quotaUsage; @@ -88,10 +96,26 @@ public class QuotaSummaryResponse extends BaseResponse { this.domainId = domainId; } + public String getDomainName() { + return domainName; + } + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + public BigDecimal getQuotaUsage() { return quotaUsage; } + public Boolean getState() { + return state; + } + + public void setState(Boolean state) { + this.state = state; + } + public void setQuotaUsage(BigDecimal startQuota) { this.quotaUsage = startQuota.setScale(2, RoundingMode.HALF_EVEN); } @@ -100,8 +124,8 @@ public class QuotaSummaryResponse extends BaseResponse { return balance; } - public void setBalance(BigDecimal endQuota) { - this.balance = endQuota.setScale(2, RoundingMode.HALF_EVEN); + public void setBalance(BigDecimal balance) { + this.balance = balance.setScale(2, RoundingMode.HALF_EVEN); } public Date getStartDate() {