[IMPROVED] Auto/Manual Payout Disabled

This will re-add the ability to disable auto or manual payouts. Option
to disable the entire cronjob is left intact.

Fixes #1034 when merged.
This commit is contained in:
Sebastian Grewe 2013-12-19 15:17:29 +01:00
parent f14fd17b2b
commit 0d6ee6d821
5 changed files with 137 additions and 114 deletions

View File

@ -35,130 +35,137 @@ if ($bitcoin->can_connect() !== true) {
$monitoring->endCronjob($cron_name, 'E0006', 1, true); $monitoring->endCronjob($cron_name, 'E0006', 1, true);
} }
// Fetch outstanding payout requests if ($setting->getValue('disable_manual_payouts') != 1) {
$aPayouts = $oPayout->getUnprocessedPayouts(); // Fetch outstanding payout requests
if (count($aPayouts > 0)) $log->logDebug(" found " . count($aPayouts) . " queued manual payout requests"); $aPayouts = $oPayout->getUnprocessedPayouts();
if (count($aPayouts > 0)) $log->logDebug(" found " . count($aPayouts) . " queued manual payout requests");
if (count($aPayouts) > 0) { if (count($aPayouts) > 0) {
$log->logInfo("\tAccount ID\tUsername\tBalance\t\tCoin Address"); $log->logInfo("\tAccount ID\tUsername\tBalance\t\tCoin Address");
foreach ($aPayouts as $aData) { foreach ($aPayouts as $aData) {
$aBalance = $transaction->getBalance($aData['account_id']); $aBalance = $transaction->getBalance($aData['account_id']);
$dBalance = $aBalance['confirmed']; $dBalance = $aBalance['confirmed'];
$aData['coin_address'] = $user->getCoinAddress($aData['account_id']); $aData['coin_address'] = $user->getCoinAddress($aData['account_id']);
$aData['username'] = $user->getUserName($aData['account_id']); $aData['username'] = $user->getUserName($aData['account_id']);
if ($dBalance > $config['txfee']) { if ($dBalance > $config['txfee']) {
// To ensure we don't run this transaction again, lets mark it completed // To ensure we don't run this transaction again, lets mark it completed
if (!$oPayout->setProcessed($aData['id'])) { if (!$oPayout->setProcessed($aData['id'])) {
$log->logFatal('unable to mark transactions ' . $aData['id'] . ' as processed.'); $log->logFatal('unable to mark transactions ' . $aData['id'] . ' as processed.');
$monitoring->endCronjob($cron_name, 'E0010', 1, true); $monitoring->endCronjob($cron_name, 'E0010', 1, true);
} }
$log->logInfo("\t" . $aData['account_id'] . "\t\t" . $aData['username'] . "\t" . $dBalance . "\t\t" . $aData['coin_address']); $log->logInfo("\t" . $aData['account_id'] . "\t\t" . $aData['username'] . "\t" . $dBalance . "\t\t" . $aData['coin_address']);
try { try {
$aStatus = $bitcoin->validateaddress($aData['coin_address']); $aStatus = $bitcoin->validateaddress($aData['coin_address']);
if (!$aStatus['isvalid']) { if (!$aStatus['isvalid']) {
$log->logError('Failed to verify this users coin address, skipping payout');
continue;
}
} catch (BitcoinClientException $e) {
$log->logError('Failed to verify this users coin address, skipping payout'); $log->logError('Failed to verify this users coin address, skipping payout');
continue; continue;
} }
} catch (BitcoinClientException $e) { try {
$log->logError('Failed to verify this users coin address, skipping payout'); $txid = $bitcoin->sendtoaddress($aData['coin_address'], $dBalance - $config['txfee']);
continue; } catch (BitcoinClientException $e) {
} $log->logError('Failed to send requested balance to coin address, please check payout process');
try {
$txid = $bitcoin->sendtoaddress($aData['coin_address'], $dBalance - $config['txfee']);
} catch (BitcoinClientException $e) {
$log->logError('Failed to send requested balance to coin address, please check payout process');
continue;
}
if ($transaction->addTransaction($aData['account_id'], $dBalance - $config['txfee'], 'Debit_MP', NULL, $aData['coin_address'], $txid) && $transaction->addTransaction($aData['account_id'], $config['txfee'], 'TXFee', NULL, $aData['coin_address'])) {
// Mark all older transactions as archived
if (!$transaction->setArchived($aData['account_id'], $transaction->insert_id))
$log->logError('Failed to mark transactions for #' . $aData['account_id'] . ' prior to #' . $transaction->insert_id . ' as archived');
// Notify user via mail
$aMailData['email'] = $user->getUserEmail($user->getUserName($aData['account_id']));
$aMailData['subject'] = 'Manual Payout Completed';
$aMailData['amount'] = $dBalance;
$aMailData['payout_id'] = $aData['id'];
if (!$notification->sendNotification($aData['account_id'], 'manual_payout', $aMailData))
$log->logError('Failed to send notification email to users address: ' . $aMailData['email']);
// Recheck the users balance to make sure it is now 0
$aBalance = $transaction->getBalance($aData['account_id']);
if ($aBalance['confirmed'] > 0) {
$log->logFatal('User has a remaining balance of ' . $aBalance['confirmed'] . ' after a successful payout!');
$monitoring->endCronjob($cron_name, 'E0065', 1, true);
}
} else {
$log->logFatal('Failed to add new Debit_MP transaction in database for user ' . $user->getUserName($aData['account_id']));
$monitoring->endCronjob($cron_name, 'E0064', 1, true);
}
}
}
}
// Fetch all users with setup AP
$users = $user->getAllAutoPayout();
if (count($users) > 0) $log->logDebug(" found " . count($users) . " queued payout(s)");
// Go through users and run transactions
if (! empty($users)) {
$log->logInfo("\tUserID\tUsername\tBalance\tThreshold\tAddress");
foreach ($users as $aUserData) {
$aBalance = $transaction->getBalance($aUserData['id']);
$dBalance = $aBalance['confirmed'];
$log->logInfo("\t" . $aUserData['id'] . "\t" . $aUserData['username'] . "\t" . $dBalance . "\t" . $aUserData['ap_threshold'] . "\t\t" . $aUserData['coin_address']);
// Only run if balance meets threshold and can pay the potential transaction fee
if ($dBalance > $aUserData['ap_threshold'] && $dBalance > $config['txfee']) {
// Validate address against RPC
try {
$aStatus = $bitcoin->validateaddress($aUserData['coin_address']);
if (!$aStatus['isvalid']) {
$log->logError('Failed to verify this users coin address, skipping payout');
continue; continue;
} }
} catch (BitcoinClientException $e) {
$log->logError('Failed to verifu this users coin address, skipping payout');
continue;
}
// Send balance, fees are reduced later by RPC Server if ($transaction->addTransaction($aData['account_id'], $dBalance - $config['txfee'], 'Debit_MP', NULL, $aData['coin_address'], $txid) && $transaction->addTransaction($aData['account_id'], $config['txfee'], 'TXFee', NULL, $aData['coin_address'])) {
try { // Mark all older transactions as archived
$txid = $bitcoin->sendtoaddress($aUserData['coin_address'], $dBalance - $config['txfee']); if (!$transaction->setArchived($aData['account_id'], $transaction->insert_id))
} catch (BitcoinClientException $e) { $log->logError('Failed to mark transactions for #' . $aData['account_id'] . ' prior to #' . $transaction->insert_id . ' as archived');
$log->logError('Failed to send requested balance to coin address, please check payout process'); // Notify user via mail
continue; $aMailData['email'] = $user->getUserEmail($user->getUserName($aData['account_id']));
} $aMailData['subject'] = 'Manual Payout Completed';
$aMailData['amount'] = $dBalance;
// Create transaction record $aMailData['payout_id'] = $aData['id'];
if ($transaction->addTransaction($aUserData['id'], $dBalance - $config['txfee'], 'Debit_AP', NULL, $aUserData['coin_address'], $txid) && $transaction->addTransaction($aUserData['id'], $config['txfee'], 'TXFee', NULL, $aUserData['coin_address'])) { if (!$notification->sendNotification($aData['account_id'], 'manual_payout', $aMailData))
// Mark all older transactions as archived $log->logError('Failed to send notification email to users address: ' . $aMailData['email']);
if (!$transaction->setArchived($aUserData['id'], $transaction->insert_id)) // Recheck the users balance to make sure it is now 0
$log->logError('Failed to mark transactions for user #' . $aUserData['id'] . ' prior to #' . $transaction->insert_id . ' as archived'); $aBalance = $transaction->getBalance($aData['account_id']);
// Notify user via mail if ($aBalance['confirmed'] > 0) {
$aMailData['email'] = $user->getUserEmail($user->getUserName($aUserData['id'])); $log->logFatal('User has a remaining balance of ' . $aBalance['confirmed'] . ' after a successful payout!');
$aMailData['subject'] = 'Auto Payout Completed'; $monitoring->endCronjob($cron_name, 'E0065', 1, true);
$aMailData['amount'] = $dBalance; }
if (!$notification->sendNotification($aUserData['id'], 'auto_payout', $aMailData)) } else {
$log->logError('Failed to send notification email to users address: ' . $aMailData['email']); $log->logFatal('Failed to add new Debit_MP transaction in database for user ' . $user->getUserName($aData['account_id']));
// Recheck the users balance to make sure it is now 0 $monitoring->endCronjob($cron_name, 'E0064', 1, true);
$aBalance = $transaction->getBalance($aUserData['id']);
if ($aBalance['confirmed'] > 0) {
$log->logFatal('User has a remaining balance of ' . $aBalance['confirmed'] . ' after a successful payout!');
$monitoring->endCronjob($cron_name, 'E0065', 1, true);
} }
} else {
$log->logFatal('Failed to add new Debit_AP transaction in database for user ' . $user->getUserName($aUserData['id']));
$monitoring->endCronjob($cron_name, 'E0064', 1, true);
} }
} }
} }
} else { } else {
$log->logDebug(" no user has configured their AP > 0"); $log->logDebug("Manual payouts are disabled via admin panel");
} }
if ($setting->getValue('disable_auto_payouts') != 1) {
// Fetch all users with setup AP
$users = $user->getAllAutoPayout();
if (count($users) > 0) $log->logDebug(" found " . count($users) . " queued payout(s)");
// Go through users and run transactions
if (! empty($users)) {
$log->logInfo("\tUserID\tUsername\tBalance\tThreshold\tAddress");
foreach ($users as $aUserData) {
$aBalance = $transaction->getBalance($aUserData['id']);
$dBalance = $aBalance['confirmed'];
$log->logInfo("\t" . $aUserData['id'] . "\t" . $aUserData['username'] . "\t" . $dBalance . "\t" . $aUserData['ap_threshold'] . "\t\t" . $aUserData['coin_address']);
// Only run if balance meets threshold and can pay the potential transaction fee
if ($dBalance > $aUserData['ap_threshold'] && $dBalance > $config['txfee']) {
// Validate address against RPC
try {
$aStatus = $bitcoin->validateaddress($aUserData['coin_address']);
if (!$aStatus['isvalid']) {
$log->logError('Failed to verify this users coin address, skipping payout');
continue;
}
} catch (BitcoinClientException $e) {
$log->logError('Failed to verifu this users coin address, skipping payout');
continue;
}
// Send balance, fees are reduced later by RPC Server
try {
$txid = $bitcoin->sendtoaddress($aUserData['coin_address'], $dBalance - $config['txfee']);
} catch (BitcoinClientException $e) {
$log->logError('Failed to send requested balance to coin address, please check payout process');
continue;
}
// Create transaction record
if ($transaction->addTransaction($aUserData['id'], $dBalance - $config['txfee'], 'Debit_AP', NULL, $aUserData['coin_address'], $txid) && $transaction->addTransaction($aUserData['id'], $config['txfee'], 'TXFee', NULL, $aUserData['coin_address'])) {
// Mark all older transactions as archived
if (!$transaction->setArchived($aUserData['id'], $transaction->insert_id))
$log->logError('Failed to mark transactions for user #' . $aUserData['id'] . ' prior to #' . $transaction->insert_id . ' as archived');
// Notify user via mail
$aMailData['email'] = $user->getUserEmail($user->getUserName($aUserData['id']));
$aMailData['subject'] = 'Auto Payout Completed';
$aMailData['amount'] = $dBalance;
if (!$notification->sendNotification($aUserData['id'], 'auto_payout', $aMailData))
$log->logError('Failed to send notification email to users address: ' . $aMailData['email']);
// Recheck the users balance to make sure it is now 0
$aBalance = $transaction->getBalance($aUserData['id']);
if ($aBalance['confirmed'] > 0) {
$log->logFatal('User has a remaining balance of ' . $aBalance['confirmed'] . ' after a successful payout!');
$monitoring->endCronjob($cron_name, 'E0065', 1, true);
}
} else {
$log->logFatal('Failed to add new Debit_AP transaction in database for user ' . $user->getUserName($aUserData['id']));
$monitoring->endCronjob($cron_name, 'E0064', 1, true);
}
}
}
} else {
$log->logDebug(" no user has configured their AP > 0");
}
} else {
$log->logDebug("Auto payouts disabled via admin panel");
}
// Cron cleanup and monitoring // Cron cleanup and monitoring
require_once('cron_end.inc.php'); require_once('cron_end.inc.php');
?> ?>

View File

@ -232,11 +232,25 @@ $aSettings['system'][] = array(
'tooltip' => 'Enable or Disable invitations. Users will not be able to invite new users via email if disabled.' 'tooltip' => 'Enable or Disable invitations. Users will not be able to invite new users via email if disabled.'
); );
$aSettings['system'][] = array( $aSettings['system'][] = array(
'display' => 'Disable Payouts', 'type' => 'select', 'display' => 'Disable Payout Cron', 'type' => 'select',
'options' => array( 0 => 'No', 1 => 'Yes' ), 'options' => array( 0 => 'No', 1 => 'Yes' ),
'default' => 0, 'default' => 0,
'name' => 'disable_payouts', 'value' => $setting->getValue('disable_payouts'), 'name' => 'disable_payouts', 'value' => $setting->getValue('disable_payouts'),
'tooltip' => 'Enable or Disable the payout processing. Users will not be able to withdraw any funds if disabled.' 'tooltip' => 'Enable or Disable the payout cronjob. Users will not be able to withdraw any funds if disabled. Will be logged in monitoring page.'
);
$aSettings['system'][] = array(
'display' => 'Disable Manual Payouts', 'type' => 'select',
'options' => array( 0 => 'No', 1 => 'Yes' ),
'default' => 0,
'name' => 'disable_manual_payouts', 'value' => $setting->getValue('disable_manual_payouts'),
'tooltip' => 'Enable or Disable manual payouts. Users will not be able to withdraw any funds manually if disabled. Will NOT be logged in monitoring page.'
);
$aSettings['system'][] = array(
'display' => 'Disable Auto Payout', 'type' => 'select',
'options' => array( 0 => 'No', 1 => 'Yes' ),
'default' => 0,
'name' => 'disable_auto_payouts', 'value' => $setting->getValue('disable_auto_payouts'),
'tooltip' => 'Enable or Disable the payout cronjob. Users will not be able to withdraw any funds automatically if disabled. Will NOT be logged in monitoring page.'
); );
$aSettings['system'][] = array( $aSettings['system'][] = array(
'display' => 'Disable notifications', 'type' => 'select', 'display' => 'Disable notifications', 'type' => 'select',

View File

@ -10,7 +10,7 @@ if ($user->isAuthenticated()) {
} else { } else {
switch (@$_POST['do']) { switch (@$_POST['do']) {
case 'cashOut': case 'cashOut':
if ($setting->getValue('disable_payouts') == 1) { if ($setting->getValue('disable_payouts') == 1 || $setting->getValue('disable_manual_payouts') == 1) {
$_SESSION['POPUP'][] = array('CONTENT' => 'Manual payouts are disabled.', 'TYPE' => 'info'); $_SESSION['POPUP'][] = array('CONTENT' => 'Manual payouts are disabled.', 'TYPE' => 'info');
} else { } else {
$aBalance = $transaction->getBalance($_SESSION['USERDATA']['id']); $aBalance = $transaction->getBalance($_SESSION['USERDATA']['id']);

View File

@ -63,8 +63,10 @@ $aGlobal = array(
'confirmations' => $config['confirmations'], 'confirmations' => $config['confirmations'],
'reward' => $config['reward'], 'reward' => $config['reward'],
'price' => $setting->getValue('price'), 'price' => $setting->getValue('price'),
'disable_payouts' => $setting->getValue('disable_payouts'),
'config' => array( 'config' => array(
'disable_payouts' => $setting->getValue('disable_payouts'),
'disable_manual_payouts' => $setting->getValue('disable_manual_payouts'),
'disable_auto_payouts' => $setting->getValue('disable_auto_payouts'),
'algorithm' => $config['algorithm'], 'algorithm' => $config['algorithm'],
'target_bits' => $config['target_bits'], 'target_bits' => $config['target_bits'],
'accounts' => $config['accounts'], 'accounts' => $config['accounts'],

View File

@ -60,7 +60,7 @@
</article> </article>
</form> </form>
{if !$GLOBAL.disable_payouts} {if !$GLOBAL.config.disable_payouts && !$GLOBAL.config.disable_manual_payouts}
<form action="{$smarty.server.PHP_SELF}" method="post"> <form action="{$smarty.server.PHP_SELF}" method="post">
<input type="hidden" name="page" value="{$smarty.request.page|escape}"> <input type="hidden" name="page" value="{$smarty.request.page|escape}">
<input type="hidden" name="action" value="{$smarty.request.action|escape}"> <input type="hidden" name="action" value="{$smarty.request.action|escape}">