/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import("funhtml.*");
import("stringutils.startsWith");
import("sqlbase.sqlobj");
import("sqlbase.sqlcommon.inTransaction");
import("etherpad.billing.team_billing");
import("etherpad.globals.*");
import("etherpad.pro.pro_accounts");
import("etherpad.pro.domains");
import("etherpad.sessions.getSession");
import("etherpad.store.checkout");
function _createRecordIfNecessary(domainId) {
inTransaction(function() {
var r = sqlobj.selectSingle('pro_account_usage', {domainId: domainId});
if (!r) {
var count = pro_accounts.getActiveCount(domainId);
sqlobj.insert('pro_account_usage', {
domainId: domainId,
count: count,
lastReset: (new Date),
lastUpdated: (new Date)
});
}
});
}
/**
* Called after a successful payment has been made.
* Effect: counts the current number of domain accounts and stores that
* as the current account usage count.
*/
function resetAccountUsageCount(domainId) {
_createRecordIfNecessary(domainId);
var newCount = pro_accounts.getActiveCount(domainId);
sqlobj.update(
'pro_account_usage',
{domainId: domainId},
{count: newCount, lastUpdated: (new Date), lastReset: (new Date)}
);
}
/**
* Returns the max number of accounts that have existed simultaneously
* since the last reset.
*/
function getAccountUsageCount(domainId) {
_createRecordIfNecessary(domainId);
var record = sqlobj.selectSingle('pro_account_usage', {domainId: domainId});
return record.count;
}
/**
* Updates the current account usage count by computing:
* usage_count = max(current_accounts, usage_count)
*/
function updateAccountUsageCount(domainId) {
_createRecordIfNecessary(domainId);
var record = sqlobj.selectSingle('pro_account_usage', {domainId: domainId});
var currentCount = pro_accounts.getActiveCount(domainId);
var newCount = Math.max(record.count, currentCount);
sqlobj.update(
'pro_account_usage',
{domainId: domainId},
{count: newCount, lastUpdated: (new Date)}
);
}
// called per request
function _generateGlobalBillingNotice(status) {
if (status == team_billing.CURRENT) {
return;
}
var notice = SPAN();
if (status == team_billing.PAST_DUE) {
var suspensionDate = checkout.formatDate(team_billing.getDomainSuspensionDate(domains.getRequestDomainId()));
notice.push(
"Warning: your account is past due and will be suspended on ",
suspensionDate, ".");
}
if (status == team_billing.SUSPENDED) {
notice.push(
"Warning: your account is suspended because it is more than ",
team_billing.GRACE_PERIOD_DAYS, " days past due.");
}
if (pro_accounts.isAdminSignedIn()) {
notice.push(" ", A({href: "/ep/admin/billing/"}, "Manage billing"), ".");
} else {
getSession().billingProblem = "Payment is required for sites with more than "+PRO_FREE_ACCOUNTS+" accounts.";
notice.push(" ", "Please ",
A({href: "/ep/payment-required"}, "contact a site administrator"), ".");
}
request.cache.globalProNotice = notice;
}
function perRequestBillingCheck() {
// Do nothing if under the free account limit.
var activeAccounts = pro_accounts.getCachedActiveCount(domains.getRequestDomainId());
if (activeAccounts <= PRO_FREE_ACCOUNTS) {
return;
}
var status = team_billing.getDomainStatus(domains.getRequestDomainId());
_generateGlobalBillingNotice(status);
// now see if we need to block the request because of account
// suspension
if (status != team_billing.SUSPENDED) {
return;
}
// These path sare still OK if a suspension is on.
if ((startsWith(request.path, "/ep/account/") ||
startsWith(request.path, "/ep/admin/") ||
startsWith(request.path, "/ep/pro-help/") ||
startsWith(request.path, "/ep/payment-required"))) {
return;
}
getSession().billingProblem = "Payment is required for sites with more than "+PRO_FREE_ACCOUNTS+" accounts.";
response.redirect('/ep/payment-required');
}