0 ORDER BY `level` ASC', __FUNCTION__, __LINE__); // "Walk" through all level while ($content = SQL_FETCHARRAY($result_refs)) { // Reset ref depths initReferalSystem(); // "Walk" through all refids //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ',level=' . $content['level'] . ',percents=' . $content['percents'] . ',points=' . $points . ' - LOOP START!'); foreach (getArrayFromRefbackLevel($userid, $content['level']) as $refid) { // Skip level zero or if both are the same if ($userid == $refid) { continue; } // END - if // Get refback percents $percents = getRefbackPercents($userid, $refid); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ',refid=' . $refid . ',points=' . $points . ',percents=' . $percents); // Some percents given? if ($percents > 0) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'points=' . $points . ',[percents]=' . $content['percents'] . ',percents=' . $percents . ',level=' . $content['level']); // Calculate points for refback $refback = $points * ($content['percents'] / 100) * ($percents / 100); // Update refback table ('refid' and 'userid' must be exchanged!) SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_user_refs` SET `points`=`points`+%s WHERE `userid`=%s AND `refid`=%s LIMIT 1", array( $refback, $refid, $userid ), __FUNCTION__, __LINE__); // Something must have been updated if (SQL_HASZEROAFFECTED()) { // Please report this bug debug_report_bug(__FUNCTION__, __LINE__, 'Nothing has been updated in user_refs,userid=' . $userid . ',refid=' . $refid . ',refback=' . $refback); } // END - if // Add points again, but only directly //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refback=' . $refback . ',userid=' . $userid . ',ref=' . $ref . ',refid=' . $refid . ' - UPDATE! (' . SQL_AFFECTEDROWS() . ')'); addPointsThroughReferalSystem(sprintf("refback:%s", $refid), $userid, $refback); // Reduce points if refid is found if ($refid == $ref) { // Reduce points here! $return = $points * ($content['percents'] / 100) - $refback; //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'return=' . $return . ' - REDUCED!'); } // END - if } // END - if } // END foreach } // END - while // Free result SQL_FREERESULT($result_refs); // Restore ref depth $GLOBALS['ref_level'] = $GLOBALS['refback_depth'][$userid][$ref]; // Return them //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ',points=' . $points . ',ref_points=' . $ref_points . ',return=' . $return . ' - EXIT!'); return $return; } // "Getter" for refback percents function getRefbackPercents ($userid, $ref) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ' - ENTERED!'); // Skip identical ids if ($userid == $ref) { return 0; } // END - if // Is it cached? if (!isset($GLOBALS['refback_percents'][$userid][$ref])) { // Default is zero $GLOBALS['refback_percents'][$userid][$ref] = '0'; // Get percents from database $result = SQL_QUERY_ESC("SELECT `refback` FROM `{?_MYSQL_PREFIX?}_user_refs` WHERE `userid`=%s AND `refid`=%s LIMIT 1", array($ref, $userid), __FUNCTION__, __LINE__); // Entry found? (Should be!) if (SQL_NUMROWS($result) == 1) { // Fetch percents list($GLOBALS['refback_percents'][$userid][$ref]) = SQL_FETCHROW($result); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ',percents=' . $GLOBALS['refback_percents'][$userid][$ref]); } else { // Debug log logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ' - No entry found. :-('); } // Free result SQL_FREERESULT($result); } // END - if // Return percents //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ',refback_percents=' . $GLOBALS['refback_percents'][$userid][$ref] . ' - EXIT!'); return $GLOBALS['refback_percents'][$userid][$ref]; } // "Getter" for userid array which will return only one entry function getArrayFromRefbackLevel ($refid, $level) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refid=' . $refid . ',level=' . $level); // Init userids $userIds = array(); // Look for all $result = SQL_QUERY_ESC("SELECT `userid` FROM `{?_MYSQL_PREFIX?}_user_refs` WHERE `refid`=%s AND `level`=%s ORDER BY `userid` ASC", array($refid, $level), __FUNCTION__, __LINE__); // Entries found? //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'numRows=' . SQL_NUMROWS($result)); if (!SQL_HASZERONUMS($result)) { // Add all while ($content = SQL_FETCHARRAY($result)) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refid=' . $refid . ',level=' . $level . ',userid=' . $content['userid']); $userIds[] = $content['userid']; } // END - while } // END - if // Free result SQL_FREERESULT($result); // Return array //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refid=' . $refid . ',userIds()=' . count($userIds) . ' - EXIT!'); return $userIds; } // Update "refback table" function updateRefbackTable ($userid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - ENTERED!'); // Load all referals loadRefbackTable($userid); // Add missing level > 1 addMissingRefbackLevels($userid); // The last step is to flush all userid's entries to the database flushRefbackTableToDatabase($userid); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - EXIT!'); } // Loads all referals for given userid function loadRefbackTable ($userid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - ENTERED!'); // Init array $GLOBALS['refback_refid'][$userid] = array(); // Get all level entries from the refsystem table $result = SQL_QUERY_ESC('SELECT `level` FROM `{?_MYSQL_PREFIX?}_refsystem` WHERE `userid`=%s ORDER BY `level` ASC', array($userid), __FUNCTION__, __LINE__); // Do we have entries? //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',SQL_NUMROWS()=' . SQL_NUMROWS($result)); if (SQL_NUMROWS($result) > 0) { // Then walk through all levels while (list($level) = SQL_FETCHROW($result)) { // Init array //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level); $GLOBALS['refback_refid'][$userid][$level] = array(); // Level is = 1? if ($level == 1) { // Load all referals of this user $result_refs = SQL_QUERY_ESC('SELECT `userid` FROM `{?_MYSQL_PREFIX?}_user_data` WHERE `refid`=%s ORDER BY `userid` ASC', array($userid), __FUNCTION__, __LINE__); // Do we have entries? //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',SQL_NUMROWS()=' . SQL_NUMROWS($result_refs)); if (SQL_NUMROWS($result_refs) > 0) { // Then again walk through all while (list($refid) = SQL_FETCHROW($result_refs)) { // Add this refid $GLOBALS['refback_refid'][$userid][$level][] = $refid; //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refid=' . $refid); // Load the refid's array as well loadRefbackTable($refid); } // END - while } // END - if // Free result SQL_FREERESULT($result_refs); } // END - if } // END - while } // END - if // Free result SQL_FREERESULT($result); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - EXIT!'); } // Adds missing refback levels to the array function addMissingRefbackLevels ($userid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - ENTERED!'); // If the array is gone, you have called this function without calling loadRefbackTable() if (!isset($GLOBALS['refback_refid'][$userid])) { // Please fix your code debug_report_bug(__FUNCTION__, __LINE__, 'Called without calling loadRefbackTable() before! userid=' . $userid); } // END - if //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',count()=' . count($GLOBALS['refback_refid'][$userid])); // Now walk through the array, first levels foreach ($GLOBALS['refback_refid'][$userid] as $level=>$levelArray) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',count()=' . count($levelArray)); // Next are the users foreach ($levelArray as $refid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refid=' . $refid); // Does the refid have an array? if (isset($GLOBALS['refback_refid'][$refid])) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refid=' . $refid . ',count()=' . count($GLOBALS['refback_refid'][$refid])); // Okay, then walk through here, too foreach ($GLOBALS['refback_refid'][$refid] as $refLevel=>$refArray) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refid=' . $refid . ',refLevel=' . $refLevel . ',count()=' . count($refArray)); // Also walk through this one foreach ($refArray as $refRefid) { // Calculate new level $newLevel = $level + $refLevel; //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refid=' . $refid . ',refLevel=' . $refLevel . ',refRefid=' . $refRefid . ',newLevel=' . $newLevel); // Is the refRefid not in? if ((!isset($GLOBALS['refback_refid'][$userid][$newLevel])) || (!in_array($refRefid, $GLOBALS['refback_refid'][$userid][$newLevel]))) { // Then we must add this ref's refid to the userid's next level //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',newLevel=' . $newLevel . ',refRefid=' . $refRefid . ' - ADDED!'); $GLOBALS['refback_refid'][$userid][$newLevel][] = $refRefid; } // END - if } // END - foreach } // END - foreach } // END - foreach } // END - foreach } // END - foreach //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - EXIT!'); } // Flush all entries for given userid to database function flushRefbackTableToDatabase ($userid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - ENTERED!'); // If the array is gone, you have called this function without calling loadRefbackTable() if (!isset($GLOBALS['refback_refid'][$userid])) { // Please fix your code debug_report_bug(__FUNCTION__, __LINE__, 'Called without calling loadRefbackTable() before! userid=' . $userid); } // END - if //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',count()=' . count($GLOBALS['refback_refid'][$userid])); // If no entries are there, skip this whole step if (count($GLOBALS['refback_refid'][$userid]) == 0) { // No entries found //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - ABORTING...'); return; } // END - if // Prepare SQL $SQL = 'INSERT INTO `{?_MYSQL_PREFIX?}_user_refs` (`userid`,`level`,`refid`) VALUES '; // Now walk through the array, first levels foreach ($GLOBALS['refback_refid'][$userid] as $level=>$levelArray) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',count()=' . count($levelArray)); // Next are the users foreach ($levelArray as $refid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refid=' . $refid); // Query the user_refs table list($count) = SQL_FETCHROW(SQL_QUERY_ESC('SELECT COUNT(`id`) AS `count` FROM `{?_MYSQL_PREFIX?}_user_refs` WHERE `userid`=%s AND `level`=%s AND `refid`=%s LIMIT 1', array( $userid, $level, $refid ), __FUNCTION__, __LINE__)); // Do we have no entry? if ($count == 0) { // Then add it to the SQL $SQL .= '(' . $userid . ',' . $level . ',' . $refid . '),'; } // END - if } // END - foreach } // END - foreach // Remove last comma from SQL $SQL = substr($SQL, 0, -1); // And run it //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',SQL=' . $SQL); SQL_QUERY($SQL, __FUNCTION__, __LINE__); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ' - EXIT!'); } // "Getter" for array for user refs in given level function getArrayFromRefbackUserRefs ($userid, $level) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ' - ENTERED!'); // Default is no refs and no nickname $refs = array(); // Get refs from database $result = SQL_QUERY_ESC("SELECT r.`id`, r.`refid`, r.`refback`, r.`points`, d.`status`, d.`joined`, d.`mails_confirmed`, d.`emails_received`, d.`refid` AS `level_refid` FROM `{?_MYSQL_PREFIX?}_user_refs` AS r LEFT JOIN `{?_MYSQL_PREFIX?}_user_data` AS d ON r.`refid`=d.`userid` WHERE r.`userid`=%s AND r.`level`=%s ORDER BY r.`refid` ASC", array(bigintval($userid), bigintval($level)), __FUNCTION__, __LINE__); // Are there some entries? if (!SQL_HASZERONUMS($result)) { // Fetch all entries while ($row = SQL_FETCHARRAY($result)) { // Init click rate $row['click_rate'] = '0'; // Does he have received some mails? if ($row['emails_received'] > 0) { // Calculate click rate $row['click_rate'] = ($row['mails_confirmed'] / $row['emails_received'] * 100); } // END - if // Add row $refs[$row['id']] = $row; } // END - while } // END - if // Free result SQL_FREERESULT($result); // Return result //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',level=' . $level . ',refs()=' . count($refs) . ' - EXIT!'); return $refs; } // "Getter" for refback entry function getArrayFromUserRefbackData ($id) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $id . ' - ENTERED!'); // Default data is nothing $data = array(); // Secure id number $id = bigintval($id); // Get entry from database $result = SQL_QUERY_ESC("SELECT `id`, `userid`, `refid`, `refback`, `level`, `points` FROM `{?_MYSQL_PREFIX?}_user_refs` WHERE `id`=%s AND `userid`=%s LIMIT 1", array($id, getMemberId()), __FUNCTION__, __LINE__); // Is there an entry? if (SQL_NUMROWS($result) == 1) { // Fetch data $data = SQL_FETCHARRAY($result); } // END - if // Free result SQL_FREERESULT($result); // Return entry //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $id . ',data()=' . count($data) . ' - EXIT!'); return $data; } // Update refback percents (but with some sanity-checks! function updateMemberRefbackPercents ($id, $percents) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $id . ',percents=' . $percents . ' - ENTERED!'); // Default status is failed $status['message'] = '{--MEMBER_REFBACK_ERROR_GENERAL--}'; // Do some sanity-checks if (!isMember()) { // No member! $status['message'] = '{--MEMBER_REFBACK_ERROR_NO_MEMBER--}'; return $status; } elseif (''.$id.'' != ''.($id + 0).'') { // No number! $status['message'] = '{--MEMBER_REFBACK_ERROR_INVALID_ID_NUMBER--}'; return $status; } elseif (($percents < 0) || ($percents > 100)) { // Percentage is not valid! $status['message'] = '{--MEMBER_REFBACK_ERROR_INVALID_PERCENTAGE--}'; return $status; } // Get ref entry $dummy = getArrayFromUserRefbackData($id); // Is this valid? if (count($dummy) == 0) { // id does not belong to user! $status['message'] = '{--MEMBER_REFBACK_ERROR_ID_MISMATCH--}'; return $status; } // END - if // Revert german commata $percents = convertCommaToDot($percents); // Update entry SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_user_refs` SET `refback`='%s' WHERE `id`=%s AND `userid`=%s LIMIT 1", array($percents, $id, getMemberId()), __FUNCTION__, __LINE__); // Entry updated? if (SQL_HASZEROAFFECTED()) { // Entry not updated! $status['message'] = '{--MEMBER_REFBACK_ERROR_NOT_UPDATED--}'; return $status; } // END - if // Prepare email content $dummy['percents'] = $percents; // Load member email template $mail = loadEmailTemplate('member_refback', $dummy, $dummy['refid']); // Send email to user sendEmail($dummy['refid'], '{--MEMBER_REFBACK_SUBJECT--}', $mail); // Send admin notification sendAdminNotification('{--ADMIN_REFBACK_SUBJECT--}', 'admin_refback', $dummy, getMemberId()); // All fine! $status['ok'] = true; // Return status array //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $id . ',percents=' . $percents . ' - EXIT!'); return $status; } // Checks wether refback is enabled function isRefbackEnabled () { // Do we have cache? if (!isset($GLOBALS[__FUNCTION__])) { // Determine it $GLOBALS[__FUNCTION__] = (getConfig('refback_enabled') == 'Y'); } // END - if // Return cache return $GLOBALS[__FUNCTION__]; } // [EOF] ?>