From: Xavier de P. <xav...@ub...> - 2010-08-20 11:44:49
|
Ok, found it, thanks, Nelson! http://doc.tikiwiki.org/Tiki+User+Credits Jonnyb and Nelson, I wonder if some integration between tiki user credits, and the credit of a user from a CCLite server (once that information is in tiki) should be performed, to avoid potential code duplicity and increase sinergy between both features. Quick documentation on the Community Currencies current feature set in Tiki6 can be seen here: http://doc.tikiwiki.org/Community+Currencies Xavi Al 20/08/10 12:51, En/na Xavier de Pedro ha escrit: > Hi Nelson: > > Is there any documentation about this new "Tiki User Credits" feature > somewhere? > I'm planning to add something here http://doc.tikiwiki.org/Tiki6 for > completeness... > > Xavi > > > Al 18/08/10 01:41, En/na nk...@us... > <mailto:nk...@us...> ha escrit: >> Revision: 28580 >> http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=28580&view=rev <http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=28580&view=rev> >> Author: nkoth >> Date: 2010-08-17 23:41:48 +0000 (Tue, 17 Aug 2010) >> >> Log Message: >> ----------- >> [NEW] Tiki User Credits feature (a way to add and use stored value) >> >> Modified Paths: >> -------------- >> trunk/lib/prefs/feature.php >> trunk/lib/setup/prefs.php >> trunk/templates/tiki-admin-include-features.tpl >> trunk/templates/tiki-admin.tpl >> trunk/tiki-setup.php >> >> Added Paths: >> ----------- >> trunk/images/barre.gif >> trunk/images/barre_empty.gif >> trunk/images/barre_fluo.gif >> trunk/images/barre_fluo_empty.gif >> trunk/images/barre_fluo_low.gif >> trunk/images/barre_low.gif >> trunk/installer/schema/20100817_credits_tiki.sql >> trunk/lib/credits/ >> trunk/lib/credits/creditslib.php >> trunk/lib/setup/credits.php >> trunk/modules/mod-func-credits.php >> trunk/templates/modules/mod-credits.tpl >> trunk/templates/tiki-admin_credits.tpl >> trunk/tiki-admin_credits.php >> >> Added: trunk/images/barre.gif >> =================================================================== >> (Binary files differ) >> >> >> Property changes on: trunk/images/barre.gif >> ___________________________________________________________________ >> Added: svn:executable >> + * >> Added: svn:mime-type >> + application/octet-stream >> >> Added: trunk/images/barre_empty.gif >> =================================================================== >> (Binary files differ) >> >> >> Property changes on: trunk/images/barre_empty.gif >> ___________________________________________________________________ >> Added: svn:mime-type >> + application/octet-stream >> >> Added: trunk/images/barre_fluo.gif >> =================================================================== >> (Binary files differ) >> >> >> Property changes on: trunk/images/barre_fluo.gif >> ___________________________________________________________________ >> Added: svn:executable >> + * >> Added: svn:mime-type >> + application/octet-stream >> >> Added: trunk/images/barre_fluo_empty.gif >> =================================================================== >> (Binary files differ) >> >> >> Property changes on: trunk/images/barre_fluo_empty.gif >> ___________________________________________________________________ >> Added: svn:mime-type >> + application/octet-stream >> >> Added: trunk/images/barre_fluo_low.gif >> =================================================================== >> (Binary files differ) >> >> >> Property changes on: trunk/images/barre_fluo_low.gif >> ___________________________________________________________________ >> Added: svn:mime-type >> + application/octet-stream >> >> Added: trunk/images/barre_low.gif >> =================================================================== >> (Binary files differ) >> >> >> Property changes on: trunk/images/barre_low.gif >> ___________________________________________________________________ >> Added: svn:mime-type >> + application/octet-stream >> >> Added: trunk/installer/schema/20100817_credits_tiki.sql >> =================================================================== >> --- trunk/installer/schema/20100817_credits_tiki.sql (rev 0) >> +++ trunk/installer/schema/20100817_credits_tiki.sql 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,31 @@ >> +CREATE TABLE IF NOT EXISTS `tiki_credits` ( >> + `creditId` INT UNSIGNED NOT NULL AUTO_INCREMENT , >> + `userId` INT( 8 ) NOT NULL , >> + `credit_type` VARCHAR( 25 ) NOT NULL , >> + `creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , >> + `expiration_date` TIMESTAMP NULL , >> + `total_amount` FLOAT NOT NULL DEFAULT 0, >> + `used_amount` FLOAT NOT NULL DEFAULT 0, >> + `product_id` INT( 8 ) NULL , >> + PRIMARY KEY ( `creditId` ) , >> + INDEX ( `userId` , `credit_type` ) >> +); >> + >> +CREATE TABLE IF NOT EXISTS `tiki_credits_usage` ( >> + `usageId` INT NOT NULL AUTO_INCREMENT, >> + `userId` INT NOT NULL, >> + `usage_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, >> + `credit_type` VARCHAR( 25 ) NOT NULL, >> + `used_amount` FLOAT NOT NULL DEFAULT 0, >> + `product_id` INT( 8 ) NULL , >> + PRIMARY KEY ( `usageId` ) >> +); >> + >> +CREATE TABLE IF NOT EXISTS `tiki_credits_types` ( >> + `credit_type` VARCHAR( 25 ) NOT NULL, >> + `display_text` VARCHAR( 50 ) DEFAULT NULL, >> + `unit_text` VARCHAR( 25 ) DEFAULT NULL, >> + `is_static_level` CHAR( 1 ) DEFAULT 'n', >> + `scaling_divisor` FLOAT NOT NULL DEFAULT 1, >> + PRIMARY KEY ( `credit_type` ) >> +); >> >> Added: trunk/lib/credits/creditslib.php >> =================================================================== >> --- trunk/lib/credits/creditslib.php (rev 0) >> +++ trunk/lib/credits/creditslib.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,392 @@ >> +<?php >> + >> +// TODO: product_id is meant for storing some information about the product >> +// purchased that led to the credits being added. >> + >> +// TODO: usage reporting >> + >> +class CreditsLib extends TikiLib { >> + >> + function getRawCredits( $userId ) // {{{ >> + { >> + $result = $this->query( "SELECT `creditId`, `credit_type`, `creation_date`, `expiration_date`, `total_amount`, `used_amount` FROM `tiki_credits` WHERE `userId` = ? ORDER BY `credit_type`, `creation_date`, `expiration_date`", array( $userId ) ); >> + >> + $credits = array(); >> + >> + while( $row = $result->fetchRow() ) { >> + $credits[ $row['creditId'] ] = $row; >> + } >> + >> + return $credits; >> + } // }}} >> + >> + function getRawCreditsByType( $userId, $credit_type ) // {{{ >> + { >> + $result = $this->query( "SELECT `creditId`, `creation_date`, `expiration_date`, `total_amount`, `used_amount` FROM `tiki_credits` WHERE `userId` = ? AND `credit_type` = ? ORDER BY `credit_type`, `creation_date`, `expiration_date`", array( $userId, $credit_type ) ); >> + >> + $credits = array(); >> + >> + while( $row = $result->fetchRow() ) { >> + $credits[ $row['creditId'] ] = $row; >> + } >> + >> + return $credits; >> + } // }}} >> + >> + function updateCreditType($credit_type, $display_text, $unit_text, $is_static_level = 'n', $scaling_divisor = 1) // {{{ >> + { >> + $bindvars = array($credit_type, $display_text, $unit_text, $is_static_level, $scaling_divisor); >> + $result = $this->query( "REPLACE INTO `tiki_credits_types` (`credit_type`, `display_text`, `unit_text`, `is_static_level`, `scaling_divisor`) VALUES (?, ?, ?, ?, ?)", $bindvars); >> + return $result; >> + } >> + >> + function getCreditTypes($staticonly = false) // {{{ >> + { >> + $result = $this->query( "SELECT `credit_type`, `display_text`, `unit_text`, `is_static_level`, `scaling_divisor` FROM `tiki_credits_types`"); >> + $creditTypes = array(); >> + >> + while( $row = $result->fetchRow() ) { >> + if ($staticonly&& $row['is_static_level'] == 'y') { >> + $creditTypes[ $row['credit_type'] ] = $row; >> + } elseif (!$staticonly) { >> + $creditTypes[ $row['credit_type'] ] = $row; >> + } >> + } >> + >> + return $creditTypes; >> + } // }}} >> + >> + function getCredits( $userId ) // {{{ >> + { >> + $result = $this->query( " >> + SELECT `credit_type`, SUM(`total_amount`) total_amount, SUM(`used_amount`) used_amount >> + FROM `tiki_credits` >> + WHERE >> + `userId` = ? >> + AND (`expiration_date` IS NULL OR `expiration_date`> NOW()) >> + AND `creation_date`<= NOW() >> + GROUP BY `credit_type` >> + ", array( $userId ) ); >> + >> + $credits = array(); >> + >> + while( $row = $result->fetchRow() ) { >> + $credits[ $row['credit_type'] ] = array( >> + 'remain' => $row['total_amount'] - $row['used_amount'], >> + 'used' => $row['used_amount'], >> + 'total' => $row['total_amount'], >> + ); >> + } >> + // Handle level-type credits in a different manner >> + // Level of used amount stored in user preferences >> + // Total used (flow) from credits table >> + global $tikilib, $userlib; >> + $info = $userlib->get_userid_info( $userId ); >> + >> + $creditTypes = $this->getCreditTypes(); >> + >> + foreach( $credits as $type => $crVal) { >> + if( $creditTypes[$type]['is_static_level'] == 'y' ) >> + { >> + $prefName = "credits_level_" . $type; >> + $credits[$type]['used'] = (float) $tikilib->get_user_preference( $info['login'], $prefName ); >> + $credits[$type]['remain'] = $credits[$type]['total'] - $credits['used']; >> + } >> + } >> + >> + return $credits; >> + } // }}} >> + >> + function getScaledCredits( $userId ) // {{{ >> + { >> + $creditTypes = $this->getCreditTypes(); >> + $credits = $this->getCredits( $userId ); >> + >> + foreach( $credits as $type => &$data ) >> + { >> + $factor = 1; >> + if( isset($creditTypes[$type])&& $creditTypes[$type]['scaling_divisor'] ) { >> + $factor = $creditTypes[$type]['scaling_divisor']; >> + } >> + if( isset($creditTypes[$type])&& $display_text = $creditTypes[$type]['display_text'] ) { >> + $data['display_text'] = $display_text; >> + } else { >> + $data['display_text'] = $type; >> + } >> + if( isset($creditTypes[$type])&& $unit_text = $creditTypes[$type]['unit_text'] ) { >> + $data['unit_text'] = $unit_text; >> + } else { >> + $data['unit_text'] = ''; >> + } >> + >> + $data['discreet_total'] = $this->scale( $data['total'], $factor ); >> + $data['discreet_used'] = $data['used'] / ($data['total'] / $data['discreet_total']); >> + $data['discreet_remain'] = $data['discreet_total'] - $data['discreet_used']; >> + $data['empty'] = $data['remain']<= 0; >> + $data['low'] = $data['remain']<= $data['total']*.15; >> + } >> + >> + return $credits; >> + } // }}} >> + >> + private function scale( $value, $factor = 1 ) // {{{ >> + { >> + // 1.5 log( (x/fac)^2 + 1 ) >> + return floor( 1.5 * log( ($value/$factor)*($value/$factor) + 1 ) ); >> + } // }}} >> + >> + function removeCreditBlock( $creditId ) // {{{ >> + { >> + $this->query( "DELETE FROM `tiki_credits` WHERE `creditId` = ?", array( $creditId ) ); >> + } // }}} >> + >> + function replaceCredit( $creditId, $type, $used, $total, $validFrom, $expirationDate ) // {{{ >> + { >> + if( !empty( $expirationDate ) ) >> + $expirationDate = date( 'Y-m-d H:i:s', $time = strtotime( $expirationDate ) ); >> + >> + if( $time === false ) >> + return false; >> + >> + $validFrom = date( 'Y-m-d H:i:s', $time = strtotime( $validFrom ) ); >> + >> + if( $time === false ) >> + return false; >> + >> + $this->query( " >> + UPDATE `tiki_credits` >> + SET `credit_type` = ?, `used_amount` = ?, `total_amount` = ?, `expiration_date` = IF(?='',NULL,?), `creation_date` = ? >> + WHERE `creditId` = ?", >> + array( $type, $used, $total, $expirationDate, $expirationDate, $validFrom, $creditId ) ); >> + } // }}} >> + >> + /** >> + * Adds a new credits entry for the user. >> + */ >> + function addCredits( $userId, $creditType, $amount, $expirationDate = null, $validFrom = null ) // {{{ >> + { >> + if( !empty( $expirationDate ) ) >> + $expirationDate = date( 'Y-m-d H:i:s', $time = strtotime( $expirationDate ) ); >> + >> + if( $time === false ) >> + return false; >> + >> + if( !empty( $validFrom ) ) >> + $validFrom = date( 'Y-m-d H:i:s', $time = strtotime( $validFrom ) ); >> + >> + if( $time === false ) >> + return false; >> + >> + $this->query( " >> + INSERT INTO `tiki_credits` >> + (`userId`, `credit_type`, `total_amount`, `expiration_date`, `creation_date`) >> + VALUES(?,?,?,IF(? = '', NULL, ?),IF(?='', NULL, ?))", >> + array( $userId, $creditType, $amount, $expirationDate, $expirationDate, $validFrom, $validFrom) ); >> + >> + return true; >> + } // }}} >> + >> + /** >> + * Use the user's credits of a certain type. If the user does not have >> + * enough credits, the function will return false. Credits may be used from >> + * different entries. Entries expiring soon will be used first. >> + */ >> + function useCredits( $userId, $creditType, $amount, $product_id = null ) // {{{ >> + { >> + if( $amount == 0 ) { >> + return true; >> + } >> + >> + // Level-type credits >> + $creditTypes = $this->getCreditTypes(); >> + if( $creditTypes[$creditType]['is_static_level'] == 'y' ) >> + { >> + $credits = $this->getCredits( $userId ); >> + if( ! array_key_exists( $creditType, $credits ) ) { >> + return false; >> + } >> + >> + if( $credits[$creditType]['remain']> 0 ) >> + { >> + global $tikilib, $userlib; >> + $info = $userlib->get_userid_info( $userId ); >> + >> + // Expense all credits if not enough >> + $toUse = min( $credits[$creditType]['used'] + $amount, $credits[$creditType]['remain'] ); >> + $prefName = "credits_level_" . $creditType; >> + >> + $tikilib->set_user_preference( >> + $info['login'], >> + $prefName, >> + $toUse ); >> + >> + if ($amount> 0) { >> + $this->_recCredits( $userId, $creditType, $amount, $product_id ); >> + } >> + >> + return true; >> + } >> + >> + return false; >> + } >> + >> + // Expendable credits >> + $result = $this->query( " >> + SELECT `creditId`, `product_id`, `total_amount` - `used_amount` as available >> + FROM `tiki_credits` >> + WHERE >> + ( `expiration_date`> NOW() OR `expiration_date` IS NULL ) >> + AND `creation_date`<= NOW() >> + AND `userId` = ? >> + AND `credit_type` = ? >> + ORDER BY IF(`expiration_date` IS NULL, 1000000, DATEDIFF(`expiration_date`, NOW())) ASC", >> + array( $userId, $creditType ) ); >> + >> + $total = 0; >> + $list = array(); >> + while( $row = $result->fetchRow() ) { >> + $total += $row['available']; >> + $list[] = $row; >> + } >> + >> + if( $total == 0 ) { >> + return false; >> + } >> + >> + if( $amount> $total ) { >> + $amount = $total; >> + } >> + >> + if ($amount> 0) { >> + $this->_recCredits( $userId, $creditType, $amount, $product_id ); >> + } >> + >> + foreach( $list as $row ) { >> + $amount = $this->_useCredits( $row['creditId'], $row['available'], $amount ); >> + if( $amount<= 0 ) { >> + return true; >> + } >> + } >> + >> + die( "The verification failed in using credits." ); >> + } // }}} >> + >> + function restoreCredits( $userId, $creditType, $amount, $product_id = null ) // {{{ >> + { >> + // Only valid for level-type credits >> + if( ! array_key_exists( $creditType, $this->getCreditTypes(true) ) ) { >> + return false; >> + } >> + >> + global $tikilib, $userlib; >> + $info = $userlib->get_userid_info( $userId ); >> + >> + $prefName = "credits_level_" . $creditType; >> + >> + $used = (float) $tikilib->get_user_preference( $info['login'], $prefName ); >> + if( $used === 0 ) { >> + return false; >> + } >> + >> + $used -= $amount; >> + if( $used< 0 ) { >> + $used = 0; >> + } >> + >> + $tikilib->set_user_preference( $info['login'], $prefName, $used ); >> + >> + if ($amount> 0) { >> + $this->_recCredits( $userId, $creditType, -1 * $amount, $product_id ); >> + } >> + >> + return true; >> + } // }}} >> + >> + /** >> + * Uses up a credit id and returns the amount of credits remaining to use. >> + */ >> + function _useCredits( $creditId, $available, $amount ) // {{{ >> + { >> + if( $available>= $amount ) { >> + $this->query( "UPDATE `tiki_credits` SET `used_amount` = `used_amount` + ? WHERE `creditId`= ?", >> + array( $amount, $creditId ) ); >> + >> + return 0; >> + } else { >> + $this->query( "UPDATE `tiki_credits` SET `used_amount` = `total_amount` WHERE `creditId `= ?", >> + array( $creditId ) ); >> + >> + return $amount - $available; >> + } >> + } // }}} >> + >> + >> + /** >> + * Uses up a credit id and returns the amount of credits remaining to use. >> + */ >> + function _recCredits( $userId, $creditType, $amount, $product_id = null ) // {{{ >> + { >> + return $this->query( "INSERT INTO `tiki_credits_usage` (`userId`, `usage_date`, `credit_type`, `used_amount`, `product_id`) VALUES (?, NOW(), ?, ?, ?)", array( $userId, $creditType, $amount, $product_id ) ); >> + } // }}} >> + >> + >> + /** >> + * Delete expired credit entries and those completely used up. >> + */ >> + function purgeCredits() // {{{ >> + { >> + $this->query( "DELETE FROM `tiki_credits` WHERE `expiration_date` IS NOT NULL AND `expiration_date`< NOW()" ); >> + $this->query( "DELETE FROM `tiki_credits` WHERE `total_amount` = `used_amount`" ); >> + } // }}} >> + >> + >> + function getPlanExpiry( $userId, $creditType ) // {{{ >> + { >> + $result = $this->getOne( "SELECT MAX(`expiration_date`) FROM `tiki_credits` WHERE `userId` = ? AND `expiration_date` IS NOT NULL AND `credit_type` = ?", array( $userId, $creditType )); >> + if ( $result ) { >> + return $result; >> + } else { >> + return ''; >> + } >> + } // }}} >> + >> + function getLatestPlanBegin( $userId, $creditType ) // {{{ >> + { >> + $result = $this->getOne( "SELECT MAX(`creation_date`) FROM `tiki_credits` WHERE `userId` = ? AND `expiration_date` IS NOT NULL AND `expiration_date`> NOW() AND `credit_type` = ? AND `creation_date`< NOW()", array( $userId, $creditType )); >> + if ( $result ) { >> + return $result; >> + } else { >> + return ''; >> + } >> + } // }}} >> + >> + function getNextPlanBegin( $userId, $creditType ) // {{{ >> + { >> + $result = $this->getOne( "SELECT MIN(`creation_date`) FROM `tiki_credits` WHERE `userId` = ? AND `expiration_date` IS NOT NULL AND `credit_type` = ? AND `creation_date`> NOW()", array( $userId, $creditType )); >> + if ( $result ) { >> + return $result; >> + } else { >> + return ''; >> + } >> + } // }}} >> + >> + function getCreditsUsage( $target_user_id, $req_type, $start_date, $end_date ) // {{{ >> + { >> + if ($req_type) { >> + $results = $this->query("SELECT * FROM tiki_credits_usage WHERE userId = ? AND credit_type = ? AND usage_date> ? AND usage_date<= ? ORDER BY `usage_date` desc", array($target_user_id, $req_type, $start_date, $end_date)); >> + } else { >> + $results = $this->query("SELECT * FROM tiki_credits_usage WHERE userId = ? AND usage_date> ? AND usage_date<= ? ORDER BY `usage_date` desc", array($target_user_id, $start_date, $end_date)); >> + } >> + $consumption_data = array(); >> + while( $row = $results->fetchRow() ) >> + { >> + $consumption_data[] = $row; >> + } >> + return $consumption_data; >> + } // }}} >> + >> +} >> + >> +$creditslib = new CreditsLib; >> + >> +?> >> >> Modified: trunk/lib/prefs/feature.php >> =================================================================== >> --- trunk/lib/prefs/feature.php 2010-08-17 23:02:46 UTC (rev 28579) >> +++ trunk/lib/prefs/feature.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -1771,5 +1771,11 @@ >> 'type' => 'flag', >> 'help' => 'Ustream+Watershed', >> ), >> + 'feature_credits' => array( >> + 'name' => tra('Tiki User Credits'), >> + 'description' => tra('Tiki User Credits'), >> + 'type' => 'flag', >> + 'help' => 'Tiki+User+Credits', >> + ), >> ); >> } >> >> Added: trunk/lib/setup/credits.php >> =================================================================== >> --- trunk/lib/setup/credits.php (rev 0) >> +++ trunk/lib/setup/credits.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,12 @@ >> +<?php >> + >> +if( $user ) >> +{ >> + require_once( 'lib/credits/creditslib.php' ); >> + if ($prefs['account_suspended'] != 'y') { >> + $tiki_user_credits = $creditslib->getScaledCredits( $tikilib->get_user_id($user) ); >> + } else { >> + $tiki_user_credits = 0; >> + } >> + $smarty->assign( 'tiki_user_credits', $tiki_user_credits ); >> +} >> \ No newline at end of file >> >> Modified: trunk/lib/setup/prefs.php >> =================================================================== >> --- trunk/lib/setup/prefs.php 2010-08-17 23:02:46 UTC (rev 28579) >> +++ trunk/lib/setup/prefs.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -1460,6 +1460,7 @@ >> 'feature_contribution_mandatory_blog' => 'n', >> 'feature_contribution_mandatory_comment' => 'n', >> 'feature_contribution_mandatory_forum' => 'n', >> + 'feature_credits' => 'n', >> 'feature_debug_console' => 'n', >> 'feature_debugger_console' => 'n', >> 'feature_display_my_to_others' => 'n', >> >> Added: trunk/modules/mod-func-credits.php >> =================================================================== >> --- trunk/modules/mod-func-credits.php (rev 0) >> +++ trunk/modules/mod-func-credits.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,21 @@ >> +<?php >> +// (c) Copyright 2002-2010 by authors of the Tiki Wiki CMS Groupware Project >> +// >> +// All Rights Reserved. See copyright.txt for details and a complete list of authors. >> +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. >> +// $Id: mod-func-google.php 26808 2010-04-28 12:30:41Z jonnybradley $ >> + >> +//this script may only be included - so its better to die if called directly. >> +if (strpos($_SERVER["SCRIPT_NAME"],basename(__FILE__)) !== false) { >> + header("location: index.php"); >> + exit; >> +} >> + >> +function module_credits_info() { >> + return array( >> + 'name' => tra('Tiki User Credits'), >> + 'description' => tra('Shows the credits a user has.'), >> + 'prefs' => array('feature_credits'), >> + 'params' => array(), >> + ); >> +} >> >> Added: trunk/templates/modules/mod-credits.tpl >> =================================================================== >> --- trunk/templates/modules/mod-credits.tpl (rev 0) >> +++ trunk/templates/modules/mod-credits.tpl 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,16 @@ >> +{tikimodule error=$module_params.error title=$tpl_module_title name="credits" flip=$module_params.flip decorations=$module_params.decorations nobox=$module_params.nobox notitle=$module_params.notitle} >> + {foreach key=id item=data from=$tiki_user_credits} >> + <div> >> + {$data.display_text|escape}: >> + {if $data.empty} >> + {section name=used loop=$data.discreet_used}<img src="images/barre_fluo_empty.gif" width="5" height="9" class="header_comptebarre" alt=""/>{/section}{section name=remain loop=$data.discreet_remain}<img src="images/barre_empty.gif" width="5" height="9" class="header_comptebarre" alt=""/>{/section}<span class="textes_comptevert"><font color='red'>{$data.used|default:0}</font></span>/{$data.total|default:0} {$data.unit_text|escape} >> + {tr}empty{/tr} >> + {elseif $data.low} >> + {section name=used loop=$data.discreet_used}<img src="images/barre_fluo_low.gif" width="5" height="9" class="header_comptebarre" alt=""/>{/section}{section name=remain loop=$data.discreet_remain}<img src="images/barre_low.gif" width="5" height="9" class="header_comptebarre" alt=""/>{/section}<span class="textes_comptevert"><font color='yellow'>{$data.used|default:0}</font></span>/{$data.total|default:0} {$data.unit_text|escape} >> + {tr}low{/tr} >> + {else} >> + {section name=used loop=$data.discreet_used}<img src="images/barre_fluo.gif" width="5" height="9" class="header_comptebarre" alt=""/>{/section}{section name=remain loop=$data.discreet_remain}<img src="images/barre.gif" width="5" height="9" class="header_comptebarre" alt=""/>{/section}<span class="textes_comptevert">{$data.used|default:0}</span>/{$data.total|default:0} {$data.unit_text|escape} >> + {/if} >> + </div> >> + {/foreach} >> +{/tikimodule} >> >> Modified: trunk/templates/tiki-admin-include-features.tpl >> =================================================================== >> --- trunk/templates/tiki-admin-include-features.tpl 2010-08-17 23:02:46 UTC (rev 28579) >> +++ trunk/templates/tiki-admin-include-features.tpl 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -151,6 +151,7 @@ >> <legend class="heading">{icon _id="new"}<span>{tr}Fresh out of the oven{/tr}</span></legend> >> {preference name=feature_socialnetworks} >> {preference name=feature_watershed} >> + {preference name=feature_credits} >> </fieldset> >> >> </div> >> >> Modified: trunk/templates/tiki-admin.tpl >> =================================================================== >> --- trunk/templates/tiki-admin.tpl 2010-08-17 23:02:46 UTC (rev 28579) >> +++ trunk/templates/tiki-admin.tpl 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -134,6 +134,7 @@ >> {if $prefs.feature_banning eq 'y'}<a href="tiki-admin_banning.php">{tr}Banning{/tr}</a> {/if} >> {if $prefs.lang_use_db eq 'y'}<a href="tiki-edit_languages.php">{tr}Edit Languages{/tr}</a> {/if} >> <a href="tiki-admin.php?page=rating">{tr}Advanced Rating{/tr}</a> >> + <a href="tiki-admin_credits.php">{tr}Tiki User Credits{/tr}</a> >> <a href="tiki-admin_transitions.php">{tr}Transitions{/tr}</a> >> <hr /> >> >> >> Added: trunk/templates/tiki-admin_credits.tpl >> =================================================================== >> --- trunk/templates/tiki-admin_credits.tpl (rev 0) >> +++ trunk/templates/tiki-admin_credits.tpl 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,190 @@ >> +{if isset($msg)}{$msg|escape}{/if} >> + >> +<h1>{tr}Manage Credits{/tr}</h1> >> +<form method="get" action="tiki-admin_credits.php"> >> + <p> >> + {tr}Username{/tr}: >> + <input type="text" name="userfilter" value="{$userfilter|escape}"/> >> + <input type="submit" value="{tr}Search{/tr}"/> >> + </p> >> +</form> >> + >> +{if $new_month}{$new_month}{/if} >> + >> +{if $editing} >> +<form method="post" action="tiki-admin_credits.php"> >> + <table class="normal"> >> + <tr> >> + <td></td> >> + <td><b>{tr}Type{/tr}</b></td> >> + <td><b>{tr}Creation Date{/tr}</b><br />{tr}(YYYY-MM-DD HH:MM:SS){/tr}</td> >> + <td><b>{tr}Expiration Date{/tr}</b><br />{tr}(YYYY-MM-DD HH:MM:SS){/tr}</td> >> + <td><b>{tr}Used{/tr}</b><br />{tr}(level credits always 0){/tr}</td> >> + <td><b>{tr}Total{/tr}</b></td> >> + </tr> >> + {foreach key=id item=data from=$credits} >> + <tr> >> + <td><input type="checkbox" name="delete[]" value="{$id|escape}"/></td> >> + <td><input type="text" name="credits[{$id|escape}][credit_type]" value="{$data.credit_type|escape}" size="8" readonly="readonly" /></td> >> + <td><input type="text" name="credits[{$id|escape}][creation_date]" value="{$data.creation_date|escape}" size="20"/></td> >> + <td><input type="text" name="credits[{$id|escape}][expiration_date]" value="{$data.expiration_date|escape}" size="20"/></td> >> + <td><input type="text" name="credits[{$id|escape}][used_amount]" value="{$data.used_amount|escape}" size="6"/></td> >> + <td><input type="text" name="credits[{$id|escape}][total_amount]" value="{$data.total_amount|escape}" size="6"/></td> >> + </tr> >> + {/foreach} >> + <tr> >> + <td><strong>New</strong></td> >> + <td> >> + <select name="credit_type"> >> + {foreach key=id item=data from=$credit_types} >> + <option value="{$id}">{$id|escape}</option> >> + {/foreach} >> + </select> >> + </td> >> + <td><input type="text" name="creation_date" value="" size="20"/></td> >> + <td><input type="text" name="expiration_date" value="" size="20"/></td> >> + <td><input type="text" name="used_amount" value="0" size="6" readonly="readonly"/></td> >> + <td><input type="text" name="total_amount" value="" size="6"/></td> >> + </tr> >> + <tr> >> + <td colspan="5"><input type="submit" name="save" value="{tr}Save{/tr}" style="display:none;"/><input type="submit" name="confirm" value="{tr}Delete Checked{/tr}"/></td> >> + <td colspan="1"><input type="submit" name="save" value="{tr}Save{/tr}"/><input type="hidden" name="userfilter" value="{$userfilter|escape}"/></td> >> + </tr> >> + </table> >> +</form> >> + >> +<h2>{tr}User Credits Expiry Summary (Plans){/tr}</h2> >> +<table class="normal"> >> + <tr> >> + <th>{tr}User Plan{/tr}</th> >> + <th>{tr}Start of Latest Plan{/tr}</th> >> + <th>{tr}Start of Next Plan{/tr}</th> >> + <th>{tr}Expiry{/tr}</th> >> + </tr> >> + {foreach key=id item=data from=$userPlans} >> + <tr> >> + <td>{$id|escape}</td> >> + <td>{if $data.currentbegin}{$data.currentbegin|escape}{else}-{/if}</td> >> + <td>{if $data.nextbegin}{$data.nextbegin|escape}{else}-{/if}</td> >> + <td>{if $data.expiry}{$data.expiry|escape}{else}-{/if}</td> >> + </tr> >> + {/foreach} >> +</table> >> + >> + >> +<h2>{tr}Test Using of User Credits{/tr}</h2> >> +<form method="post" action="tiki-admin_credits.php"> >> + {tr}Use:{/tr}<select name="use_credit_type"> >> + {foreach key=id item=data from=$credit_types} >> + <option value="{$id}">{$id|escape}</option> >> + {/foreach} >> + </select> >> + <br /> >> + {tr}Amount:{/tr}<input type="text" name="use_credit_amount" value="0" size="8" /> >> + <input type="hidden" name="userfilter" value="{$userfilter|escape}"/> >> + <input type="submit" name="use_credit" value="{tr}Use{/tr}"/> >> +</form> >> + >> +<h2>{tr}Test Restoring of User Level Credits{/tr}</h2> >> +<form method="post" action="tiki-admin_credits.php"> >> + {tr}Restore:{/tr}<select name="restore_credit_type"> >> + {foreach key=id item=data from=$static_credit_types} >> + <option value="{$id}">{$id|escape}</option> >> + {/foreach} >> + </select> >> + <br /> >> + {tr}Amount:{/tr}<input type="text" name="restore_credit_amount" value="0" size="8" /> >> + <input type="hidden" name="userfilter" value="{$userfilter|escape}"/> >> + <input type="submit" name="restore_credit" value="{tr}Restore{/tr}"/> >> +</form> >> + >> +<h2>{tr}Historical Usage Report{/tr}</h2> >> + <div> >> + <form method="post" action="tiki-admin_credits.php"> >> + <input type="hidden" name="userfilter" value="{$userfilter|escape}"/> >> + <table class='normal'> >> + <tr> >> + <td> >> + {html_select_date time=$startDate prefix="startDate_" end_year="-10" day_value_format="%02d" field_order=$prefs.display_field_order} >> + <br /> >> + {html_select_date time=$endDate prefix="endDate_" end_year="-10" day_value_format="%02d" field_order=$prefs.display_field_order} >> + </td> >> + <td> >> + <select name="action_type"> >> + <option value="">{tr}all types{/tr}</option> >> + {foreach key=id item=data from=$credit_types} >> + <option value="{$id}" {if $act_type eq '{$id}'}selected="selected"{/if}>{$id|escape}</option> >> + {/foreach} >> + </select> >> + </td> >> + >> + <td> >> + >> + </td> >> + <td><input type="submit" value="{tr}filter{/tr}" /><br/><br/></td> >> + </tr> >> + <tr> >> + <th>{tr}Type{/tr}</th> >> + <th>{tr}Usage Date{/tr}</th> >> + <th colspan='2'>{tr}Amount Used{/tr}</th> >> + </tr> >> + {foreach item=con_data from=$consumption_data} >> + <tr> >> + <td>{$con_data.credit_type}</td> >> + <td>{$con_data.usage_date|date_format:"%d-%m-%Y %H:%M:%S"}</td> >> + <td colspan='2'>{$con_data.used_amount}</td> >> + </tr> >> + {/foreach} >> + </table> >> + </form> >> + </div> >> +{else} >> +{tr}No such user{/tr} >> +{/if} >> +<hr /> >> +<h1>{tr}Manage Credit Types{/tr}</h1> >> +<form method="post" action="tiki-admin_credits.php"> >> + <table class="normal"> >> + <tr> >> + <td></td> >> + <td><b>{tr}Type{/tr}</b></td> >> + <td><b>{tr}Display Text{/tr}</b></td> >> + <td><b>{tr}Unit Text{/tr}</b></td> >> + <td><b>{tr}Is Static Level Credit{/tr}</b></td> >> + <td><b>{tr}Display Bar Length Scaling Divisor{/tr}</b></td> >> + </tr> >> + {foreach key=id item=data from=$credit_types} >> + <tr> >> + <td> </td> >> + <td><input type="text" name="credit_types[{$id|escape}][credit_type]" value="{$data.credit_type|escape}" size="8" readonly="readonly" /></td> >> + <td><input type="text" name="credit_types[{$id|escape}][display_text]" value="{$data.display_text|escape}" size="8"/></td> >> + <td><input type="text" name="credit_types[{$id|escape}][unit_text]" value="{$data.unit_text|escape}" size="8"/></td> >> + <td><select name="credit_types[{$id|escape}][is_static_level]"> >> + <option value='n' />No</option> >> + <option value='y' {if $data.is_static_level == 'y'}selected="selected"{/if}/>Yes</option> >> + </select> >> + <td><input type="text" name="credit_types[{$id|escape}][scaling_divisor]" value="{$data.scaling_divisor|escape}" size="6"/></td> >> + </tr> >> + {/foreach} >> + <tr> >> + <td><strong>New</strong></td> >> + <td><input type="text" name="new_credit_type" value="" size="8"/></td> >> + <td><input type="text" name="display_text" value="" size="8"/></td> >> + <td><input type="text" name="unit_text" value="" size="8"/></td> >> + <td><select name="is_static_level"> >> + <option value='n' />No</option> >> + <option value='y' />Yes</option> >> + </select></td> >> + <td><input type="text" name="scaling_divisor" value="1" size="6"/></td> >> + </tr> >> + <tr> >> + <td colspan="6"><input type="submit" name="update_types" value="{tr}Save{/tr}"/><input type="hidden" name="userfilter" value="{$userfilter|escape}"/></td> >> + </tr> >> + </table> >> + >> +</form> >> + >> +<h2>{tr}Purge Expired and Used Credits (All Users){/tr}</h2> >> +<form method="post" action="tiki-admin_credits.php"> >> + <input type="submit" name="purge_credits" value="{tr}Purge{/tr}"/> >> +</form> >> \ No newline at end of file >> >> Added: trunk/tiki-admin_credits.php >> =================================================================== >> --- trunk/tiki-admin_credits.php (rev 0) >> +++ trunk/tiki-admin_credits.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -0,0 +1,158 @@ >> +<?php >> + >> +require_once 'tiki-setup.php'; >> +require_once 'lib/credits/creditslib.php'; >> + >> +if ($tiki_p_admin_users != 'y') { >> + $smarty->assign('msg', tra("You do not have permission to use this feature")); >> + $smarty->display("error.tpl"); >> + die; >> +} >> + >> +if( isset( $_REQUEST['use_credit'] )&& $use_credit_userid = $tikilib->get_user_id($_POST['userfilter']) ) { >> + $creditslib->useCredits( $use_credit_userid, >> + $_POST['use_credit_type'], >> + $_POST['use_credit_amount'] >> + ); >> + header( 'Location: tiki-admin_credits.php?userfilter=' . urlencode($_REQUEST['userfilter'] ) ); >> + exit; >> +} >> + >> +if( isset( $_REQUEST['restore_credit'] )&& $restore_credit_userid = $tikilib->get_user_id($_POST['userfilter']) ) { >> + $creditslib->restoreCredits( $restore_credit_userid, >> + $_POST['restore_credit_type'], >> + $_POST['restore_credit_amount'] >> + ); >> + header( 'Location: tiki-admin_credits.php?userfilter=' . urlencode($_REQUEST['userfilter'] ) ); >> + exit; >> +} >> + >> +if( isset( $_REQUEST['purge_credits'] ) ) { >> + $creditslib->purgeCredits(); >> + header( 'Location: tiki-admin_credits.php'); >> + exit; >> +} >> + >> +if( isset( $_REQUEST['update_types'] ) ) { >> + foreach( $_POST['credit_types'] as $key => $values ) >> + { >> + $creditslib->updateCreditType($values['credit_type'], >> + $values['display_text'], >> + $values['unit_text'], >> + $values['is_static_level'], >> + $values['scaling_divisor']); >> + } >> + >> + if( !empty( $_POST['new_credit_type'] ) ) >> + { >> + $creditslib->updateCreditType($_POST['new_credit_type'], >> + $_POST['display_text'], >> + $_POST['unit_text'], >> + $_POST['is_static_level'], >> + $_POST['scaling_divisor']); >> + } >> +} >> + >> +$creditTypes = $creditslib->getCreditTypes(); >> +$staticCreditTypes = $creditslib->getCreditTypes(true); >> +$smarty->assign('credit_types', $creditTypes); >> +$smarty->assign('static_credit_types', $staticCreditTypes); >> + >> +if( isset( $_REQUEST['userfilter'] ) ) >> +{ >> + $smarty->assign( 'userfilter', $_REQUEST['userfilter'] ); >> + >> + $editing = $userlib->get_user_info( $_REQUEST['userfilter'] ); >> + >> + if( $editing ) >> + { >> + $userPlans = array(); >> + foreach ($creditTypes as $ct => $v) { >> + $userPlans[$ct]["nextbegin"] = $creditslib->getNextPlanBegin($editing['userId'], $ct); >> + $userPlans[$ct]["currentbegin"] = $creditslib->getLatestPlanBegin($editing['userId'], $ct); >> + $userPlans[$ct]["expiry"] = $creditslib->getPlanExpiry($editing['userId'], $ct); >> + } >> + $smarty->assign('userPlans', $userPlans); >> + >> + $credits = $creditslib->getRawCredits( $editing['userId'] ); >> + $smarty->assign( 'credits', $credits ); >> + $smarty->assign( 'editing', $editing ); >> + >> + // Get usage information >> + >> + // date values >> + if (isset($_REQUEST['startDate_Year']) || isset($_REQUEST['endDate_Year'])) { >> + $smarty->assign( 'startDate', $tikilib->make_time(0, 0, 0, $_REQUEST['startDate_Month'], $_REQUEST['startDate_Day'], $_REQUEST['startDate_Year']) ); >> + $smarty->assign( 'endDate', $tikilib->make_time(23, 59, 59, $_REQUEST['endDate_Month'], $_REQUEST['endDate_Day'], $_REQUEST['endDate_Year']) ); >> + $start_date = $_REQUEST['startDate_Year'] . "-" . $_REQUEST['startDate_Month'] . "-" . $_REQUEST['startDate_Day']; >> + $end_date = $_REQUEST['endDate_Year'] . "-" . $_REQUEST['endDate_Month'] . "-" . $_REQUEST['endDate_Day'] . " 23:59:59"; >> + } else { >> + $start_date = $tikilib->now - 3600 * 24 * 30; >> + $smarty->assign( 'startDate', $start_date ); >> + $end_date = date('Y-m-d 23:59:59'); >> + } >> + >> + $req_type = $_REQUEST['action_type']; >> + $smarty->assign( 'act_type', $req_type ); >> + >> + $consumption_data = $creditslib->getCreditsUsage($editing['userId'], $req_type, $start_date, $end_date); >> + $smarty->assign( 'consumption_data', $consumption_data); >> + >> + if( isset( $_POST['save'], $_POST['credits'] ) ) // {{{ >> + { >> + foreach( $_POST['credits'] as $key => $values ) >> + { >> + if( ! isset( $credits[$key] ) ) >> + die('Mismatch'); >> + >> + $same = true; >> + $current = $credits[$key]; >> + foreach( $current as $field => $value ) >> + if( $field != 'creditId'&& $value != $values[$field] ) >> + { >> + $same = false; >> + break; >> + } >> + >> + if( ! $same ) >> + { >> + $creditslib->replaceCredit( $key, >> + $values['credit_type'], >> + $values['used_amount'], >> + $values['total_amount'], >> + $values['creation_date'], >> + $values['expiration_date'] ); >> + } >> + } >> + >> + if( !empty( $_POST['credit_type'] )&& !empty( $_POST['total_amount'] )&& in_array($_POST['credit_type'], array_keys($creditTypes)) ) >> + { >> + $creditslib->addCredits( $editing['userId'], $_POST['credit_type'], $_POST['total_amount'], $_POST['expiration_date'], $_POST['creation_date'] ); >> + } >> + >> + header( 'Location: tiki-admin_credits.php?userfilter=' . urlencode($_REQUEST['userfilter'] ) ); >> + exit; >> + } // }}} >> + >> + if( !empty( $_POST['credit_type'] )&& !empty( $_POST['total_amount'] ) ) // {{{ >> + { >> + $creditslib->addCredits( $editing['userId'], $_POST['credit_type'], $_POST['total_amount'], $_POST['expiration_date'], $_POST['creation_date'] ); >> + >> + header( 'Location: tiki-admin_credits.php?userfilter=' . urlencode($_REQUEST['userfilter'] ) ); >> + exit; >> + } // }}} >> + >> + if( isset( $_POST['confirm'], $_POST['delete'] ) ) // {{{ >> + { >> + foreach( $_POST['delete'] as $creditId ) >> + if( isset( $credits[$creditId] ) ) >> + $creditslib->removeCreditBlock( $creditId ); >> + >> + header( 'Location: tiki-admin_credits.php?userfilter=' . urlencode($_REQUEST['userfilter'] ) ); >> + exit; >> + } // }}} >> + } >> +} >> + >> +$smarty->assign('mid', 'tiki-admin_credits.tpl'); >> +$smarty->display("tiki.tpl"); >> >> Modified: trunk/tiki-setup.php >> =================================================================== >> --- trunk/tiki-setup.php 2010-08-17 23:02:46 UTC (rev 28579) >> +++ trunk/tiki-setup.php 2010-08-17 23:41:48 UTC (rev 28580) >> @@ -134,6 +134,10 @@ >> $smarty->assign_by_ref('captchalib', $captchalib); >> } >> >> +if ($prefs['feature_credits'] == 'y') { >> + require_once('lib/setup/credits.php'); >> +} >> + >> $smarty->assign_by_ref('phpErrors', $phpErrors); >> $smarty->assign_by_ref('num_queries', $num_queries); >> $smarty->assign_by_ref('elapsed_in_db', $elapsed_in_db); >> >> >> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. >> >> ------------------------------------------------------------------------------ >> This SF.net email is sponsored by >> >> Make an app they can't live without >> Enter the BlackBerry Developer Challenge >> http://p.sf.net/sfu/RIM-dev2dev >> _______________________________________________ >> Tikiwiki-cvs mailing list >> Tik...@li... <mailto:Tik...@li...> >> https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs >> >> > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by > > Make an app they can't live without > Enter the BlackBerry Developer Challenge > http://p.sf.net/sfu/RIM-dev2dev > > > _______________________________________________ > Tikiwiki-cvs mailing list > Tik...@li... > https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs > |