0 AND d.mails_confirmed >= {?ref_payout?} AND p.ref_depth=1 AND p.points > 0 AND d.userid=%s", array(bigintval($content['userid'])), __FUNCTION__, __LINE__); // Get points list($cpoints) = SQL_FETCHROW($result_ref); // Free result SQL_FREERESULT($result_ref); if (empty($cpoints)) $cpoints = '0.00000'; // Add info line SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_rallye_users` (`rallye_id`, `userid`, `refs`, `curr_points`) VALUES (%s, %s, %s, %s)", array( bigintval($id), bigintval($content['userid']), bigintval($count), $cpoints ), __FUNCTION__, __LINE__); $un = true; } // END - if // Free memory SQL_FREERESULT($result_ref); // Ignored but for the template required refs (made before start of rallye) $content['refs'] = $count; // Shall I notify this member? if (($notify == 'Y') && ($un)) { // Load email template and send it to the user $message = loadEmailTemplate('member_rallye_notify', $content, $content['userid']); sendEmail($content['userid'], getMaskedMessage('RALLYE_MEMBER_NOTIFY', $title), $message); } // END - if } // END - while // Choose the right admin template $templ = 'admin_rallye_no_notify'; if ($notify == 'Y') $templ = 'admin_rallye_notify'; // Send email to admin sendAdminNotification(getMaskedMessage('RALLYE_ADMIN_NOTIFY', $title), $templ, $prices); // Free memory SQL_FREERESULT($result_user); } // function addReferalRallyePrices ($rallye, $mode = 'email') { // Output mode switch($mode) { case 'email': $mode = "\n"; break; case 'html' : $mode = '
'; break; } // END - switch // Load prices $result_prices = SQL_QUERY_ESC("SELECT `price_level`, `points`, `info` FROM `{?_MYSQL_PREFIX?}_rallye_prices` WHERE `rallye_id`=%s ORDER BY `price_level` ASC", array($rallye), __FUNCTION__, __LINE__); // Entries found? if (!SQL_HASZERONUMS($result_prices)) { // Load prices if ($mode == "\n") $prices = '{--RALLYE_MEMBER_PRICES_ADDED--}:' . $mode . '------------------------------' . $mode; $prices = ''; while ($content = SQL_FETCHARRAY($result_prices)) { $prices .= $content['price_level']. '{--RALLYE_PRICE--}: '; if (!empty($content['info'])) { $prices .= $content['info']; } else { $prices .= $content['points'] . ' {?POINTS?}'; } $prices .= '' . $mode; } // END - if // Free memory SQL_FREERESULT($result_prices); } else { // No prices??? $prices = getMaskedMessage('RALLYE_MEMBER_NO_PRICES', $mode); } // Add last line for email mode if ($mode == "\n") $prices .= '------------------------------'; // Return price list return $prices; } // function addReferalRallyeTopUsers ($rallye, $default=0) { // Init variables $min_users = 0; $min_prices = 0; // First check how many prices are set $prices = countSumTotalData($rallye, 'rallye_prices', 'id', 'rallye_id', true); // And load only limited users $result = SQL_QUERY_ESC("SELECT u.userid, u.refs, u.curr_points, rd.min_users, rd.min_prices FROM `{?_MYSQL_PREFIX?}_rallye_users` AS u LEFT JOIN `{?_MYSQL_PREFIX?}_refsystem` AS r ON u.userid=r.userid LEFT JOIN `{?_MYSQL_PREFIX?}_rallye_data` AS rd ON u.rallye_id=rd.id WHERE u.`rallye_id`=%s AND r.counter > 0 ORDER BY u.refs DESC", array(bigintval($rallye)), __FUNCTION__, __LINE__); // Load users $DATA = array( 'userid' => array(), 'ref' => array(), 'cpoints' => array() ); // Load all users while ($content = SQL_FETCHARRAY($result)) { // Get current refs $count = getReferalRallyeRefsCount($content['userid'], $content['refs']); // Points of ref's $result_ref = SQL_QUERY_ESC("SELECT p.points FROM `{?_MYSQL_PREFIX?}_user_points` AS p LEFT JOIN `{?_MYSQL_PREFIX?}_user_data` AS d ON p.userid=d.userid WHERE d.userid=%s AND d.`status`='CONFIRMED' AND p.ref_depth=1 AND d.max_mails > 0 AND d.mails_confirmed >= {?ref_payout?} LIMIT 1", array(bigintval($content['userid'])), __FUNCTION__, __LINE__); // Get points list($refpoints) = SQL_FETCHROW($result_ref); // Free result SQL_FREERESULT($result_ref); if (empty($refpoints)) $refpoints = '0'; // Init userid for list $userid = '---'; // List only users with at least one ref! //* DEBUG: */ debugOutput('*'.$count.'/'.$content['userid'].'/'.$content['curr_points'].'/'.$refpoints.'*'); if (($count > 0) && ($refpoints > $content['curr_points'])) { $userid = $content['userid']; } else { $count = ''; } // Save values to array $DATA['userid'][] = $userid; $DATA['ref'][] = $count; $DATA['cpoints'][] = $content['curr_points']; $min_users = $content['min_users']; $min_prices = $content['min_prices']; } // END - while // Free memory SQL_FREERESULT($result); // Sort whole array array_pk_sort($DATA, array('ref', 'cpoints'), 0, 1, true); // Generate table $OUT = ''; for ($idx = '0'; $idx < $prices; $idx++) { // Prepare marking of default (maybe current user's) id $start = ''; $end = ''; if (($DATA['userid'][$idx] == $default) && ($default > 0)) { $start = ''; $end = ''; } // END - if // Prepare content $content = array( 'idx' => ($idx + 1), 'start' => $start, 'end' => $end, 'userid' => $DATA['userid'][$idx], 'ref' => $DATA['ref'][$idx], 'infos' => '' ); // Load row template and switch color $OUT .= loadTemplate('guest_rallye_row', true, $content); } // END - for // Add min_prices/users $content['rows'] = $OUT; $content['min_prices'] = bigintval($min_prices); $content['min_users'] = bigintval($min_users); // And finnally return the output return loadTemplate('guest_rallye', true, $content); } // Run this function only when a new member has confirmed his email address! function addUserToReferalRallye ($userid, $content = array()) { $add = ''; // Updated extension? if (isExtensionInstalledAndNewer('rallye', '0.2.0')) { $add .= ', `min_users`, `min_prices`'; } // END - if // Check for an auto-add rallye $result = SQL_QUERY("SELECT `id`, `title`, `start_time`, `end_time`, `send_notify`".$add." FROM `{?_MYSQL_PREFIX?}_rallye_data` WHERE `is_active`='Y' AND `notified`='Y' AND `auto_add_new_user`='Y' AND `expired`='N' LIMIT 1", __FUNCTION__, __LINE__); if (SQL_NUMROWS($result) == 1) { // Init variables $min_users = '0'; $min_prices = '0'; // Load data if (isExtensionInstalledAndNewer('rallye', '0.2.0')) { list($id, $title, $start, $end, $notify, $min_users, $min_prices) = SQL_FETCHROW($result); } else { list($id, $title, $start, $end, $notify) = SQL_FETCHROW($result); } // Free result SQL_FREERESULT($result); if ($notify == 'Y') { // Transfer all neccessary data to $content array $content['start'] = generateDateTime($start, 2); $content['end'] = generateDateTime($end , 2); $content['now_t'] = generateDateTime(time(), 2); $content['title'] = $title; $content['id'] = $id; // id for the rallye details link $content['ref'] = '0'; $content['refs'] = countSumTotalData($userid, 'user_data', 'userid', 'refid', true); // Load prices $content['prices'] = addReferalRallyePrices($id); // Determine min_users/prices tring $content['min_users'] = determineReferalRallyeMinimumUsers($min_users); $content['min_prices'] = determineReferalRallyeMinimumPrices($min_prices); // Send notification to member $message = loadEmailTemplate('member_rallye_notify', $content, $userid); sendEmail($userid, getMaskedMessage('RALLYE_MEMBER_NOTIFY', $title), $message); } // END - if // Check if line is already included... $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_rallye_users` WHERE `rallye_id`=%s AND `userid`=%s LIMIT 1", array( bigintval($id), bigintval($userid) ), __FUNCTION__, __LINE__); // Is this user added? if (SQL_HASZERONUMS($result)) { // Add userid and his ref count to table SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_rallye_users` (`rallye_id`, `userid`, `refs`) VALUES (%s,%s,0)", array( bigintval($id), bigintval($userid) ), __FUNCTION__, __LINE__); } // END - if // Free memory SQL_FREERESULT($result); } // END - if } // function markReferalRallyesAsExpired ($result) { global $DATA; // Load rallye data list($id, $title, $start, $end, $notify, $min_users, $min_prices) = SQL_FETCHROW($result); // Free result SQL_FREERESULT($result); // Load users array (!) with assigned prices $prices = getArrayFromReferalRallyeUsers($id); // Init array $DATA = array(); $count = '0'; $users = array(); $DATA['title'] = $title; $DATA['start'] = generateDateTime($start, 1); $DATA['end'] = generateDateTime($end , 1); $DATA['now_t'] = generateDateTime(time(), 1); // Just count... $total = '0'; foreach ($prices['userid'] as $key => $userid) { // Check status // active = 1: account is still confirmed // active = 0: account is deleted or locked $active = countSumTotalData($userid, 'user_data', 'userid', 'userid', true, " AND `status`='CONFIRMED'"); $prices['active'][$key] = $active; // Allow valid and active users with at least one ref to get points if ((isValidUserId($userid)) && ($prices['ref'][$key] > 0) && ($active == 1) && ($prices['cpoints'][$key] > 0)) { $total++; } // END - if } // END - foreach if (($total < $min_prices) || ($total == '0')) { // Do not end this rallye! unset($DATA); return; } // END - if // Expire rallye SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_rallye_data` SET `expired`='Y' WHERE `id`=%s LIMIT 1", array(bigintval($id)), __FUNCTION__, __LINE__); // Run array through (by userid is the most important 2nd-level-array) foreach ($prices['userid'] as $key => $userid) { // Allow valid and active users with at least one ref to get points if ((isValidUserId($userid)) && ($prices['ref'][$key] > 0) && ($prices['active'][$key] == 1) && ($prices['cpoints'][$key] > 0)) { // Transfer data to array for the mail template $DATA['level'] = $prices['level'][$key]; $DATA['points'] = $prices['points'][$key]; $DATA['info'] = $prices['info'][$key]; $DATA['ref'] = $prices['ref'][$key]; // Default is other $winnerLevel = 'other'; // Determine winner level if ($DATA['level'] == 1) { // The winner! $winnerLevel = '_gold'; } elseif ($DATA['level'] == 2) { // The vice winner! $winnerLevel = '_silver'; } elseif ($DATA['level'] == 3) { // The bronce winner $winnerLevel = '_bronce'; } if ($DATA['points'] > 0) { // Add points directly to user's account addPointsDirectly('rallye_winner' . $winnerLevel, $userid, $DATA['points']); } // END - if if ($notify == 'Y') { // Prepare infos for the mail template if (!empty($DATA['info'])) { // Take direct infos $DATA['infos'] = $DATA['info']; } else { // Take points $DATA['infos'] = $DATA['points'] . ' {?POINTS?}'; } // Add suffix to template name $template = 'member_rallye_expired' . $winnerLevel; // Load template $message = loadEmailTemplate($template, $DATA, $userid); sendEmail($userid, getMaskedMessage('RALLYE_MEMBER_EXPIRED_SUBJECT', $DATA['level']), $message); } // END - if // Count userid $count++; $users['userid'][$userid] = $userid; $users['poi'][$userid] = $DATA['infos']; } // END - if } // END - foreach // Select template depending on notfication is switch on / off if ($notify == 'Y') { $templ = 'admin_rallye_expired'; } elseif (is_array($users['userid'])) { $templ = 'admin_rallye_expired_no'; $count = getReferalRallyeUserDataFromArray($users); } // Send mail to admin sendAdminNotification(getMaskedMessage('RALLYE_ADMIN_EXPIRED_SUBJECT', $title), $templ, $count); // Add task (we ignore the task id here) createNewTask('{--RALLYE_ADMIN_EXPIRED--}: ' . $title, '{--RALLYE_ADMIN_EXPIRED_TEXT--}', 'RALLYE_EXPIRED'); } // function getReferalRallyeUserDataFromArray ($userIds) { // Implode user ids $userid_string = implode(',', $userIds['userid']); // Init result string $ret = ''; // Load users $result = SQL_QUERY_ESC("SELECT `userid`, `gender`, `surname`, `family`, `email` FROM `{?_MYSQL_PREFIX?}_user_data` WHERE `userid` IN(%s) AND `status`='CONFIRMED' ORDER BY `userid` ASC LIMIT %s", array( $userid_string, count($userIds) ), __FUNCTION__, __LINE__); while ($content = SQL_FETCHARRAY($result)) { // Construct the message masked and add it $ret .= sprintf("%s %s %s (%s) - %s\n", translateGender($content['gender']), $content['surname'], $content['family'], $content['email'], $userIds['poi'][$content['userid']] ); } // END - while // Return result return substr($ret, 0, -1); } // function getArrayFromReferalRallyePrices ($rallye) { // Init multi array $prices = array( 'level' => array(), 'points' => array(), 'info' => array() ); // Load prices $result = SQL_QUERY_ESC("SELECT `price_level`, `points`, `info` FROM `{?_MYSQL_PREFIX?}_rallye_prices` WHERE `rallye_id`=%s ORDER BY `price_level` ASC", array(bigintval($rallye)), __FUNCTION__, __LINE__); // Transfer elements while ($content = SQL_FETCHARRAY($result)) { $prices['level'][] = $content['price_level']; $prices['points'][] = $content['points']; $prices['info'][] = $content['info']; } // END - while // Free memory SQL_FREERESULT($result); // Return array return $prices; } // function getArrayFromReferalRallyeUsers ($rallye) { // Fix zero points to 0.00000 if (getConfig('ref_payout') == '0') setConfigEntry('ref_payout', '0.00000'); // Init multi array $users = array( 'userid' => array(), 'ref' => array(), 'cpoints' => array(), ); // Load users userid old points earned $result_user = SQL_QUERY_ESC("SELECT `userid`, `refs`, `curr_points` FROM `{?_MYSQL_PREFIX?}_rallye_users` WHERE `rallye_id`=%s ORDER BY `userid` ASC", array(bigintval($rallye)), __FUNCTION__, __LINE__); while ($content = SQL_FETCHARRAY($result_user)) { // Load current ref count $count = getReferalRallyeRefsCount($content['userid'], $content['refs']); // Points of ref's $result_ref = SQL_QUERY_ESC("SELECT SUM(p.points) AS `points` FROM `{?_MYSQL_PREFIX?}_user_points` AS p LEFT JOIN `{?_MYSQL_PREFIX?}_user_data` AS d ON p.userid=d.userid WHERE d.`status`='CONFIRMED' AND d.max_mails > 0 AND d.mails_confirmed >= {?ref_payout?} AND p.ref_depth=1 AND p.points > 0 AND d.userid=%s LIMIT 1", array(bigintval($content['userid'])), __FUNCTION__, __LINE__); // Get points list($refpoints) = SQL_FETCHROW($result_ref); // Free result SQL_FREERESULT($result_ref); // Fix empty refpoints if (empty($refpoints)) $refpoints = '0'; // Store calculated new refs to array $users['userid'][] = $content['userid']; $users['ref'][] = abs($count - $content['refs']); $users['cpoints'][] = $refpoints - $content['curr_points']; } // END - while // Free memory SQL_FREERESULT($result_user); // Sort array for refs (descending) array_pk_sort($users, array('ref', 'cpoints'), 0, 1, true); // Load prices array (!) $prices = getArrayFromReferalRallyePrices($rallye); // Merge users into prices foreach ($prices['level'] as $k => $level) { // We only need to check one element in $users, see above while() block if (isset($users['userid'][$k])) { $prices['userid'][$k] = $users['userid'][$k]; $prices['ref'][$k] = $users['ref'][$k]; $prices['cpoints'][$k] = $users['cpoints'][$k]; } // END - if } // END - foreach // Return completed array return $prices; } // @TODO This function does not load min_users, min_prices, please encapsulate loading rallye data with e.g. getRallyeDataFromId() function addReferalRallyeWinners ($rallye, $default=0) { // First check how many prices are set $prices = countSumTotalData(bigintval($rallye), 'rallye_prices', 'id', 'rallye_id', true); // Load data $DATA = getArrayFromReferalRallyeUsers($rallye); // Generate table $OUT = ''; for ($idx = '0'; $idx < $prices; $idx++) { // Check status // active = 1: account is still confirmed // active = 0: account is deleted or locked $active = countSumTotalData($DATA['userid'][$idx], 'user_data', 'userid', 'userid', true, " AND `status`='CONFIRMED'"); if ((empty($DATA['ref'][$idx])) || ($DATA['ref'][$idx] == '0') || ($active == '0') || ('' . round($DATA['cpoints'][$idx]) . '' == '0') || (empty($DATA['cpoints'][$idx]))) { // Allow valid and active users with at least one ref to get points $DATA['ref'][$idx] = '---'; $DATA['userid'][$idx] = '---'; } // END - if if (!empty($DATA['info'][$idx])) { // Take direct infos $DATA['infos'][$idx] = $DATA['info'][$idx]; } else { // Take ppints $DATA['infos'][$idx] = $DATA['points'][$idx] . ' {?POINTS?}'; } // Prepare marking of default (maybe current user's) id $start = ''; $end = ''; if (($DATA['userid'][$idx] == $default) && ($default > 0)) { $start = ''; $end = ''; } // END - if // Prepare content $content = array( 'idx' => ($idx + 1), 'userid' => $DATA['userid'][$idx], 'ref' => $DATA['ref'][$idx], 'infos' => $DATA['infos'][$idx], 'start' => $start, 'end' => $end ); // Load row template $OUT .= loadTemplate('guest_rallye_row', true, $content); } // END - for // Prepare content $content = array( 'rows' => $OUT, 'min_users' => '???', 'min_prices' => '???' ); // Load main template and finnally return the output return loadTemplate('guest_rallye', true, $content); } // function purgeExpiredReferalRallyes () { // Check for expired rallyes $EXPIRE = 3; // @TODO The hard-coded value... $result_rallye = SQL_QUERY_ESC("SELECT `id`, `title`, `start_time`, `end_time` FROM `{?_MYSQL_PREFIX?}_rallye_data` WHERE `end_time` <= (UNIX_TIMESTAMP() - {?ONE_DAY?} - %s) AND `expired`='Y'", array($EXPIRE), __FUNCTION__, __LINE__); if (!SQL_HASZERONUMS($result_rallye)) { // Init SQLs initSqls(); // Expire found rallyes and notify admin while ($content = SQL_FETCHARRAY($result_rallye)) { // Prepare data for mail template $content['start_time'] = generateDateTime($content['start_time'], 1); $content['end_time'] = generateDateTime($content['end_time'] , 1); $content['now_time'] = generateDateTime(time(), 1); // Send mail to admin sendAdminNotification(getMaskedMessage('RALLYE_ADMIN_PURGED_SUBJECT', $content['title']), 'admin_rallye_purged', $content); // Purge whole rallye addSql(SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_rallye_data` WHERE `id`=%s LIMIT 1", array(bigintval($content['id'])), __FUNCTION__, __LINE__, false)); addSql(SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_rallye_prices` WHERE `rallye_id`=%s LIMIT 1", array(bigintval($content['id'])), __FUNCTION__, __LINE__, false)); addSql(SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_rallye_users` WHERE `rallye_id`=%s LIMIT 1", array(bigintval($content['id'])), __FUNCTION__, __LINE__, false)); // Add task (we ignore the task id here createNewTask('{--RALLYE_ADMIN_PURGED--}: ' . $content['title'], '{--RALLYE_ADMIN_PURGED_TEXT--}', 'RALLYE_PURGED'); } // END - while // Run all SQLs runFilterChain('run_sqls'); } // END - if // Free memory SQL_FREERESULT($result_rallye); } // function addReferalRallyeTemplateSelection ($name = 'template', $default = '') { // Init variables $OUT = ''; $ral = array(); // Check templates directory $basePath = sprintf("templates/%s/html/rallye/", getLanguage()); // Read the directory $templates = getArrayFromDirectory($basePath, 'rallye_', false, true, array(), '.tpl'); // And walk through foreach ($templates as $read) { // Cut prefix and extension away $read = substr($read, 7, strpos($read, '.') - 7); // Accept only template names between 1 and 255 chars length if ((strlen($read) < 256) && (!empty($read))) { // Valid entry found $ral[$read] = $read; } else { // Log invalid logDebugMessage(__FUNCTION__, __LINE__, sprintf("WARNING: Template %s not used.", $read)); } } // END - foreach // Do we have found templates which we can link with the new rallye? if (!empty($ral[0])) { // Generate selection box for all found templates $OUT = ''; } else { // No rallye templates found $OUT = '{--RALLYE_NO_TEMPLATES_FOUND--}'; } // Return selection return $OUT; } // @TODO Please document this function function getReferalRallyeRefsCount ($currUserid, $old = '0') { // Check current refs if (isExtensionInstalledAndNewer('cache', '0.1.2')) { // Get refs from cache $count = '0'; foreach ($GLOBALS['cache_array']['refsystem']['userid'] as $id => $userid) { // Do we have a ref for this user? //* DEBUG: */ debugOutput('id='.$id.',userid='.$userid.',userid='.$userid.',old='.$old.',level='.$GLOBALS['cache_array']['refsystem']['level'][$id]); if (($currUserid == $userid) && ($GLOBALS['cache_array']['refsystem']['level'][$id] == 1)) { //* DEBUG: */ debugOutput('userid matches!'); foreach ($GLOBALS['cache_array']['refdepths']['level'] as $level) { if (($level == $GLOBALS['cache_array']['refsystem']['level'][$id]) && ($level == 1)) { // Level does exist so abort here $count = $GLOBALS['cache_array']['refsystem']['counter'][$id]; //* DEBUG: */ debugOutput('*'.$userid.'/'.$count.'*'); break; } elseif ($level > 1) { // Not interesting here... break; } } // END - foreach // Abort also here! if ($count > 0) break; } // END - if } // END - foreach //* DEBUG: */ debugOutput('
'.print_r($GLOBALS['cache_array']['refsystem'], true).'
'); //* DEBUG: */ shutdown(); if ($count > 0) { // Count cache hits incrementStatsEntry('cache_hits'); // Remove old refs //* DEBUG: */ debugOutput('+'.$count.'/'.$old.'+'); $count -= $old; } // END - if } else { // Load current refs from database $result_ref = SQL_QUERY_ESC("SELECT SUM(s.counter) AS cnt FROM `{?_MYSQL_PREFIX?}_refsystem` AS s LEFT JOIN `{?_MYSQL_PREFIX?}_refdepths` AS d ON s.level=d.level WHERE s.userid=%s AND s.level=1", array( bigintval($userid) ), __FUNCTION__, __LINE__); // Load count @TODO Can't we rewrite this to our API? list($count) = SQL_FETCHROW($result_ref); // Free result SQL_FREERESULT($result_ref); if (empty($count)) { $count = '0'; } else { $count -= $old; } } // Return count //* DEBUG: */ debugOutput('*'.$userid.'/'.$old.'/'.$count.'*'); return $count; } // Determines the right language string for min_users function determineReferalRallyeMinimumUsers ($min_users) { // Rallye ends without user limitation is the default $return = '{--RALLYE_END_NO_USER_LIMITATION--}'; if ($min_users > 0) { // Rallye ends when X members are totally in your exchange $return = getMaskedMessage('RALLYE_END_USERS', $min_users); } // END - if // Return return $return; } // Determines the right language string for min_prices function determineReferalRallyeMinimumPrices ($min_prices) { // Rallye ends without user limitation is the default $return = '{--RALLYE_END_NO_PRICE_LIMITATION--}'; if ($min_prices > 0) { // Rallye ends when X members are totally in your exchange $return = getMaskedMessage('RALLYE_END_PRICES', $min_prices); } // END - if // Return return $return; } // [EOF] ?>