aboutsummaryrefslogblamecommitdiffstats
path: root/etherpad/src/etherpad/pro/pro_quotas.js
blob: ed69e1c7d11c4c2b3f4cedd879a92dcf12a5a3eb (plain) (tree)












































































































































                                                                                                                 
/**
 * 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');
}