0 ORDER BY `level` ASC', __FUNCTION__, __LINE__); // "Walk" through all level while ($content = sqlFetchArray($result_refs)) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'level=' . $content['level'] . ',percents=' . $content['percents'] . ' - LOOP START!'); // Reset ref depths initReferralSystem(); // Init array $refids = getArrayFromRefbackLevel($userid, $content['level']); // "Walk" through all refids //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',ref=' . $ref . ',level=' . $content['level'] . ',percents=' . $content['percents'] . ',points=' . $points . ' - LOOP START!'); foreach ($refids as $refid) { /* * Get refback percents, do not swap $refid and $userid by the next * call. If you do so, you will check the wrong direction, $userid * is always bigger than $refid. */ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . convertNullToZero($refid) . ' - CALLING getRefbackPercents()'); $content['refback_percents'] = getRefbackPercents($refid, $userid); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . convertNullToZero($refid) . ',refback_percents=' . $content['refback_percents']); // Some percents given? if ($content['refback_percents'] > 0) { // Calculate points for refback $refbackPoints = $points * ($content['percents'] / 100) * ($content['refback_percents'] / 100); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'points=' . $points . ',percents=' . $content['percents'] . ',refback_percents=' . $content['refback_percents'] . ',level=' . $content['level'] . ',refback_points=' . $refbackPoints); // Update refback table ('refid' and 'userid' must be exchanged!) sqlQueryEscaped('UPDATE `{?_MYSQL_PREFIX?}_user_refs` SET `refback_points`=`refback_points`+%s WHERE `userid`=%s AND `refid`=%s LIMIT 1', array( $refbackPoints, $refid, $userid ), __FUNCTION__, __LINE__); // Something must have been updated if (ifSqlHasZeroAffectedRows()) { // Please report this bug reportBug(__FUNCTION__, __LINE__, 'Nothing has been updated in user_refs,userid=' . $userid . ',refid=' . convertNullToZero($refid) . ',refbackPoints=' . $refbackPoints); } // END - if // Add points again, but only directly //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refbackPoints=' . $refbackPoints . ',userid=' . $userid . ',ref=' . $ref . ',refid=' . convertNullToZero($refid) . ' - REFBACK-UPDATE! (' . sqlAffectedRows() . ')'); addPointsThroughReferralSystem(sprintf('refback:%s', $refid), $userid, $refbackPoints); // Reduce points if refid is found //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . $refid . ',ref=' . $ref . ' - REDUCING?'); if ($refid == $ref) { // Reduce points here! $return = $points * ($content['percents'] / 100) - $refbackPoints; //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'return=' . $return . ' - REDUCED!'); } // END - if } // END - if } // END foreach } // END - while // Free result sqlFreeResult($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 * * @param $userid "Current" user's userid * @param $refid $userid has this userid as referral * @return $percents Refback percents $userid has given to $refid */ function getRefbackPercents ($userid, $refid) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . $refid . ' - ENTERED!'); if ((!isValidId($userid)) || (!isValidId($refid))) { // userid and/or refid is invalid reportBug(__FUNCTION__, __LINE__, 'userid=' . convertNullToZero($userid) . ', refid=' . convertNullToZero($refid) . ' - Both must be > 0'); } elseif ($userid == $refid) { // Skip identical ids return 0; } // END - if // Is it cached? if (!isset($GLOBALS['refback_percents'][$userid][$refid])) { // Default is zero $GLOBALS['refback_percents'][$userid][$refid] = '0'; // Get percents from database $result = sqlQueryEscaped("SELECT `refback_percents` FROM `{?_MYSQL_PREFIX?}_user_refs` WHERE `userid`=%s AND `refid`=%s LIMIT 1", array($userid, $refid), __FUNCTION__, __LINE__); // Entry found? (Should be!) if (sqlNumRows($result) == 1) { // Fetch percents list($GLOBALS['refback_percents'][$userid][$refid]) = sqlFetchRow($result); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . $refid . ',percents=' . $GLOBALS['refback_percents'][$userid][$refid]); } else { // Please report all findings reportBug(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . $refid . ' - No entry found. :-('); } // Free result sqlFreeResult($result); } // END - if // Return percents //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $userid . ',refid=' . $refid . ',refback_percents=' . $GLOBALS['refback_percents'][$userid][$refid] . ' - EXIT!'); return $GLOBALS['refback_percents'][$userid][$refid]; } // "Getter" for userid array which will return only one entry function getArrayFromRefbackLevel ($refid, $level) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refid=' . convertNullToZero($refid) . ',level=' . $level . ' - ENTERED!'); // Init userids $userIds = array(); // Look for all $result = sqlQueryEscaped("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=' . sqlNumRows($result)); if (!ifSqlHasZeroNumRows($result)) { // Add all while ($content = sqlFetchArray($result)) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refid=' . convertNullToZero($refid) . ',level=' . $level . ',userid=' . $content['userid']); array_push($userIds, $content['userid']); } // END - while } // END - if // Free result sqlFreeResult($result); // Return array //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'refid=' . convertNullToZero($refid) . ',userIds()=' . count($userIds) . ' - EXIT!'); return $userIds; } // "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 = sqlQueryEscaped("SELECT `r`.`id`, `r`.`refid`, `r`.`refback_percents`, `r`.`refback_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 (!ifSqlHasZeroNumRows($result)) { // Fetch all entries while ($row = sqlFetchArray($result)) { // Calculate click rate $row['click_rate'] = calculatePercentageRate($row['mails_confirmed'], $row['emails_received']); // Add row $refs[$row['id']] = $row; } // END - while } // END - if // Free result sqlFreeResult($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 = sqlQueryEscaped("SELECT `id`, `userid`, `refid`, `refback_percents`, `level`, `refback_points` FROM `{?_MYSQL_PREFIX?}_user_refs` WHERE `id`=%s AND `userid`=%s LIMIT 1", array($id, getMemberId()), __FUNCTION__, __LINE__); // Is there an entry? if (sqlNumRows($result) == 1) { // Fetch data $data = sqlFetchArray($result); } // END - if // Free result sqlFreeResult($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, $note) { //* 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 $content = getArrayFromUserRefbackData($id); // Is this valid? if (!isFilledArray($content)) { // 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 sqlQueryEscaped("UPDATE `{?_MYSQL_PREFIX?}_user_refs` SET `refback_percents`='%s' WHERE `id`=%s AND `userid`=%s LIMIT 1", array( $percents, $id, getMemberId() ), __FUNCTION__, __LINE__); // Entry updated? if (ifSqlHasZeroAffectedRows()) { // Entry not updated! $status['message'] = 'MEMBER_REFBACK_ERROR_NOT_UPDATED'; return $status; } // END - if // Prepare email content $content['refback_percents'] = $percents; $content['refback_notice'] = $note; // Load member email template $mail = loadEmailTemplate('member_refback', $content, $content['refid']); // Send email to user sendEmail($content['refid'], '{--MEMBER_REFBACK_SUBJECT--}', $mail); // Send admin notification sendAdminNotification('{--ADMIN_REFBACK_SUBJECT--}', 'admin_refback', $content, $content['refid']); // All fine! $status['ok'] = TRUE; // Return status array //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $id . ',percents=' . $percents . ' - EXIT!'); return $status; } // ---------------------------------------------------------------------------- // Wrapper functions for configuration entries // ---------------------------------------------------------------------------- // Getter for refback_enabled function getRefbackEnabled () { // Is there cache? if (!isset($GLOBALS[__FUNCTION__])) { // Determine it $GLOBALS[__FUNCTION__] = getConfig('refback_enabled'); } // END - if // Return cache return $GLOBALS[__FUNCTION__]; } // Checks whether refback is enabled function isRefbackEnabled () { // Is there cache? if (!isset($GLOBALS[__FUNCTION__])) { // Determine it $GLOBALS[__FUNCTION__] = (getRefbackEnabled() == 'Y'); } // END - if // Return cache return $GLOBALS[__FUNCTION__]; } // Getter for refback_max_perc function getRefbackMaxPerc () { // Is there cache? if (!isset($GLOBALS[__FUNCTION__])) { // Determine it $GLOBALS[__FUNCTION__] = getConfig('refback_max_perc'); } // END - if // Return cache return $GLOBALS[__FUNCTION__]; } // Getter for refback_min_perc function getRefbackMinPerc () { // Is there cache? if (!isset($GLOBALS[__FUNCTION__])) { // Determine it $GLOBALS[__FUNCTION__] = getConfig('refback_min_perc'); } // END - if // Return cache return $GLOBALS[__FUNCTION__]; } // [EOF] ?>