From eb5f2446f186ec00ff41beacac8e981fb56924ce Mon Sep 17 00:00:00 2001 From: jysperm Date: Fri, 22 Aug 2014 18:13:00 +0800 Subject: [PATCH] refactor --- config.coffee | 8 ++++++ core/billing.coffee | 61 ++++++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/config.coffee b/config.coffee index 7881746..626a7ef 100644 --- a/config.coffee +++ b/config.coffee @@ -16,6 +16,14 @@ module.exports = available_extensions: ['rpvhost'] 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: shadowsocks: t_name: 'ShadowSocks 按量付费' diff --git a/core/billing.coffee b/core/billing.coffee index 22ac76d..1bdfdef 100644 --- a/core/billing.coffee +++ b/core/billing.coffee @@ -4,20 +4,21 @@ plan = require './plan' mAccount = require './model/account' mBalance = require './model/balance' -exports.dailyBilling = -> +exports.cyclicalBilling = -> mAccount.find 'attribute.plans.0': $exists: true .toArray (err, accounts) -> for account in accounts - exports.calcBilling account, false, -> - -exports.dailyBilling() -setInterval exports.dailyBilling, 3600 * 1000 + exports.calcBilling account, + is_force: false + , -> exports.checkBilling = (account, callback) -> - if (Date.now() - account.attribute.last_billing_at.getTime()) > 24 * 3600 * 1000 - exports.calcBilling account, false, callback + if Date.now() > account.attribute.last_billing_at.getTime() + config.billing.daily_billing_cycle + exports.calcBilling account, + is_force: false + , callback else callback account @@ -25,27 +26,28 @@ exports.checkExpired = (account, callback) -> modifier = $set: {} - callcallback = -> - mAccount.update _id: account._id, modifier, -> - mAccount.findId account._id, (err, account) -> - callback account + callback_back = -> + mAccount.findAndModify _id: account._id, {}, modifier, new: true, (err, account)-> + callback account if account.attribute.balance > 0 modifier.$set['attribute.arrears_at'] = null 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 - modifier.$set['attribute.arrears_at'] = new Date() - else - if account.attribute.balance < -5 - return exports.forceUnsubscribe account, callcallback + account.attribute.arrears_at = modifier.$set['attribute.arrears_at'] = new Date() - if Date.now() - account.attribute.arrears_at.getTime() > 15 * 24 * 3600 * 1000 - return exports.forceUnsubscribe account, callcallback + if Date.now() > account.attribute.arrears_at.getTime() + config.billing.force_unsubscribe.when_arrears_above + 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, -> amount = 0 @@ -53,22 +55,22 @@ exports.calcBilling = (account, isForce, callback) -> plan_info = config.plans[planName] 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 - billing_time = Math.ceil time + if is_force + billing_time_hour = Math.ceil time_hour 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 return callback account - if isForce + if is_force new_last_billing_at = new Date() 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 = $set: @@ -79,8 +81,8 @@ exports.calcBilling = (account, isForce, callback) -> mAccount.update _id: account._id, modifier, -> mBalance.create account, 'billing', -amount, plans: account.attribute.plans - billing_time: billing_time - is_force: isForce + billing_time: billing_time_hour + is_force: is_force last_billing_at: account.attribute.last_billing_at , -> mAccount.findId account._id, (err, account) -> @@ -102,3 +104,6 @@ exports.calcRemainingTime = (account) -> price += plan_info.price / 30 / 24 return account.attribute.balance / price + +exports.cyclicalBilling() +setInterval exports.cyclicalBilling, config.billing.cyclical_billing