From 0d6ee6d82169cd7589623919a17d0c15f3e3a6df Mon Sep 17 00:00:00 2001 From: Sebastian Grewe Date: Thu, 19 Dec 2013 15:17:29 +0100 Subject: [PATCH] [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. --- cronjobs/payouts.php | 225 +++++++++--------- public/include/config/admin_settings.inc.php | 18 +- public/include/pages/account/edit.inc.php | 2 +- public/include/smarty_globals.inc.php | 4 +- .../templates/mpos/account/edit/default.tpl | 2 +- 5 files changed, 137 insertions(+), 114 deletions(-) diff --git a/cronjobs/payouts.php b/cronjobs/payouts.php index 58960e72..fae2ed86 100755 --- a/cronjobs/payouts.php +++ b/cronjobs/payouts.php @@ -35,130 +35,137 @@ if ($bitcoin->can_connect() !== true) { $monitoring->endCronjob($cron_name, 'E0006', 1, true); } -// Fetch outstanding payout requests -$aPayouts = $oPayout->getUnprocessedPayouts(); -if (count($aPayouts > 0)) $log->logDebug(" found " . count($aPayouts) . " queued manual payout requests"); +if ($setting->getValue('disable_manual_payouts') != 1) { + // Fetch outstanding payout requests + $aPayouts = $oPayout->getUnprocessedPayouts(); + if (count($aPayouts > 0)) $log->logDebug(" found " . count($aPayouts) . " queued manual payout requests"); -if (count($aPayouts) > 0) { - $log->logInfo("\tAccount ID\tUsername\tBalance\t\tCoin Address"); - foreach ($aPayouts as $aData) { - $aBalance = $transaction->getBalance($aData['account_id']); - $dBalance = $aBalance['confirmed']; - $aData['coin_address'] = $user->getCoinAddress($aData['account_id']); - $aData['username'] = $user->getUserName($aData['account_id']); - if ($dBalance > $config['txfee']) { - // To ensure we don't run this transaction again, lets mark it completed - if (!$oPayout->setProcessed($aData['id'])) { - $log->logFatal('unable to mark transactions ' . $aData['id'] . ' as processed.'); - $monitoring->endCronjob($cron_name, 'E0010', 1, true); - } + if (count($aPayouts) > 0) { + $log->logInfo("\tAccount ID\tUsername\tBalance\t\tCoin Address"); + foreach ($aPayouts as $aData) { + $aBalance = $transaction->getBalance($aData['account_id']); + $dBalance = $aBalance['confirmed']; + $aData['coin_address'] = $user->getCoinAddress($aData['account_id']); + $aData['username'] = $user->getUserName($aData['account_id']); + if ($dBalance > $config['txfee']) { + // To ensure we don't run this transaction again, lets mark it completed + if (!$oPayout->setProcessed($aData['id'])) { + $log->logFatal('unable to mark transactions ' . $aData['id'] . ' as processed.'); + $monitoring->endCronjob($cron_name, 'E0010', 1, true); + } - $log->logInfo("\t" . $aData['account_id'] . "\t\t" . $aData['username'] . "\t" . $dBalance . "\t\t" . $aData['coin_address']); - try { - $aStatus = $bitcoin->validateaddress($aData['coin_address']); - if (!$aStatus['isvalid']) { + $log->logInfo("\t" . $aData['account_id'] . "\t\t" . $aData['username'] . "\t" . $dBalance . "\t\t" . $aData['coin_address']); + try { + $aStatus = $bitcoin->validateaddress($aData['coin_address']); + 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'); continue; } - } catch (BitcoinClientException $e) { - $log->logError('Failed to verify this users coin address, skipping payout'); - continue; - } - 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'); + 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; } - } 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); + 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); } - } 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"); + $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 require_once('cron_end.inc.php'); ?> diff --git a/public/include/config/admin_settings.inc.php b/public/include/config/admin_settings.inc.php index 9858dd76..3f7c6f36 100644 --- a/public/include/config/admin_settings.inc.php +++ b/public/include/config/admin_settings.inc.php @@ -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.' ); $aSettings['system'][] = array( - 'display' => 'Disable Payouts', 'type' => 'select', + 'display' => 'Disable Payout Cron', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), 'default' => 0, '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( 'display' => 'Disable notifications', 'type' => 'select', diff --git a/public/include/pages/account/edit.inc.php b/public/include/pages/account/edit.inc.php index 3b575303..3bb9c778 100644 --- a/public/include/pages/account/edit.inc.php +++ b/public/include/pages/account/edit.inc.php @@ -10,7 +10,7 @@ if ($user->isAuthenticated()) { } else { switch (@$_POST['do']) { 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'); } else { $aBalance = $transaction->getBalance($_SESSION['USERDATA']['id']); diff --git a/public/include/smarty_globals.inc.php b/public/include/smarty_globals.inc.php index e6b601bb..0623b449 100644 --- a/public/include/smarty_globals.inc.php +++ b/public/include/smarty_globals.inc.php @@ -63,8 +63,10 @@ $aGlobal = array( 'confirmations' => $config['confirmations'], 'reward' => $config['reward'], 'price' => $setting->getValue('price'), - 'disable_payouts' => $setting->getValue('disable_payouts'), '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'], 'target_bits' => $config['target_bits'], 'accounts' => $config['accounts'], diff --git a/public/templates/mpos/account/edit/default.tpl b/public/templates/mpos/account/edit/default.tpl index 920a36f1..11d82b1e 100644 --- a/public/templates/mpos/account/edit/default.tpl +++ b/public/templates/mpos/account/edit/default.tpl @@ -60,7 +60,7 @@ -{if !$GLOBAL.disable_payouts} +{if !$GLOBAL.config.disable_payouts && !$GLOBAL.config.disable_manual_payouts}