This commit is contained in:
jysperm
2014-08-22 18:13:00 +08:00
parent 3a99f3ea95
commit eb5f2446f1
2 changed files with 41 additions and 28 deletions

View File

@@ -16,6 +16,14 @@ module.exports =
available_extensions: ['rpvhost'] available_extensions: ['rpvhost']
available_services: ['shadowsocks'] available_services: ['shadowsocks']
billing:
force_unsubscribe:
when_balance_below: 0
when_arrears_above: 0
cyclical_billing: 3600 * 1000
daily_billing_cycle: 24 * 3600 * 1000
plans: plans:
shadowsocks: shadowsocks:
t_name: 'ShadowSocks 按量付费' t_name: 'ShadowSocks 按量付费'

View File

@@ -4,20 +4,21 @@ plan = require './plan'
mAccount = require './model/account' mAccount = require './model/account'
mBalance = require './model/balance' mBalance = require './model/balance'
exports.dailyBilling = -> exports.cyclicalBilling = ->
mAccount.find mAccount.find
'attribute.plans.0': 'attribute.plans.0':
$exists: true $exists: true
.toArray (err, accounts) -> .toArray (err, accounts) ->
for account in accounts for account in accounts
exports.calcBilling account, false, -> exports.calcBilling account,
is_force: false
exports.dailyBilling() , ->
setInterval exports.dailyBilling, 3600 * 1000
exports.checkBilling = (account, callback) -> exports.checkBilling = (account, callback) ->
if (Date.now() - account.attribute.last_billing_at.getTime()) > 24 * 3600 * 1000 if Date.now() > account.attribute.last_billing_at.getTime() + config.billing.daily_billing_cycle
exports.calcBilling account, false, callback exports.calcBilling account,
is_force: false
, callback
else else
callback account callback account
@@ -25,27 +26,28 @@ exports.checkExpired = (account, callback) ->
modifier = modifier =
$set: {} $set: {}
callcallback = -> callback_back = ->
mAccount.update _id: account._id, modifier, -> mAccount.findAndModify _id: account._id, {}, modifier, new: true, (err, account)->
mAccount.findId account._id, (err, account) -> callback account
callback account
if account.attribute.balance > 0 if account.attribute.balance > 0
modifier.$set['attribute.arrears_at'] = null modifier.$set['attribute.arrears_at'] = null
if account.attribute.balance < 0 if account.attribute.balance < 0
if account.attribute.balance < config.billing.force_unsubscribe.when_balance_below
return exports.forceUnsubscribe account, callback_back
unless account.attribute.arrears_at unless account.attribute.arrears_at
modifier.$set['attribute.arrears_at'] = new Date() account.attribute.arrears_at = modifier.$set['attribute.arrears_at'] = new Date()
else
if account.attribute.balance < -5
return exports.forceUnsubscribe account, callcallback
if Date.now() - account.attribute.arrears_at.getTime() > 15 * 24 * 3600 * 1000 if Date.now() > account.attribute.arrears_at.getTime() + config.billing.force_unsubscribe.when_arrears_above
return exports.forceUnsubscribe account, callcallback return exports.forceUnsubscribe account, callback_back
callcallback() callback_back()
exports.calcBilling = (account, options, callback) ->
{is_force} = options
exports.calcBilling = (account, isForce, callback) ->
exports.checkExpired account, -> exports.checkExpired account, ->
amount = 0 amount = 0
@@ -53,22 +55,22 @@ exports.calcBilling = (account, isForce, callback) ->
plan_info = config.plans[planName] plan_info = config.plans[planName]
price = plan_info.price / 30 / 24 price = plan_info.price / 30 / 24
time = (Date.now() - account.attribute.last_billing_at.getTime()) / 1000 / 3600 time_hour = (Date.now() - account.attribute.last_billing_at.getTime()) / 1000 / 3600
if isForce if is_force
billing_time = Math.ceil time billing_time_hour = Math.ceil time_hour
else else
billing_time = Math.floor time billing_time_hour = Math.floor time_hour
amount += price * billing_time amount += price * billing_time_hour
if amount <= 0 if amount <= 0
return callback account return callback account
if isForce if is_force
new_last_billing_at = new Date() new_last_billing_at = new Date()
else else
new_last_billing_at = new Date account.attribute.last_billing_at.getTime() + billing_time * 3600 * 1000 new_last_billing_at = new Date account.attribute.last_billing_at.getTime() + billing_time_hour * 3600 * 1000
modifier = modifier =
$set: $set:
@@ -79,8 +81,8 @@ exports.calcBilling = (account, isForce, callback) ->
mAccount.update _id: account._id, modifier, -> mAccount.update _id: account._id, modifier, ->
mBalance.create account, 'billing', -amount, mBalance.create account, 'billing', -amount,
plans: account.attribute.plans plans: account.attribute.plans
billing_time: billing_time billing_time: billing_time_hour
is_force: isForce is_force: is_force
last_billing_at: account.attribute.last_billing_at last_billing_at: account.attribute.last_billing_at
, -> , ->
mAccount.findId account._id, (err, account) -> mAccount.findId account._id, (err, account) ->
@@ -102,3 +104,6 @@ exports.calcRemainingTime = (account) ->
price += plan_info.price / 30 / 24 price += plan_info.price / 30 / 24
return account.attribute.balance / price return account.attribute.balance / price
exports.cyclicalBilling()
setInterval exports.cyclicalBilling, config.billing.cyclical_billing