Copyright updated
[core.git] / inc / classes / main / points / class_UserPoints.php
1 <?php
2 /**
3  * A class for handling user points which can be real or Internet currency
4  *
5  * @author              Roland Haeder <webmaster@ship-simu.org>
6  * @version             0.0.0
7  * @copyright   Copyright (c) 2007 - 2009 Roland Haeder, this is free software
8  * @license             GNU GPL 3.0 or any newer version
9  * @link                http://www.ship-simu.org
10  *
11  * This program is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program. If not, see <http://www.gnu.org/licenses/>.
23  */
24 class UserPoints extends BaseFrameworkSystem implements Registerable, BookablePoints {
25         /**
26          * Amount of points
27          */
28         private $amount = 0;
29
30         /**
31          * Protected constructor
32          *
33          * @return      void
34          */
35         protected function __construct () {
36                 // Call parent constructor
37                 parent::__construct(__CLASS__);
38
39                 // Clean up a little
40                 $this->removeNumberFormaters();
41                 $this->removeSystemArray();
42         }
43
44         /**
45          * Creates an instance of this points class
46          *
47          * @param       $userInstance           An instance of a user class
48          * @return      $pointsInstance         An instance of this class
49          */
50         public final static function createUserPoints (ManageableAccount $userInstance) {
51                 // Get a new instance
52                 $pointsInstance = new UserPoints();
53
54                 // Set user instance
55                 $pointsInstance->setUserInstance($userInstance);
56
57                 // Return instance
58                 return $pointsInstance;
59         }
60
61         /**
62          * Setter for amount
63          *
64          * @param       $amount         Amount of points to store
65          * @return      void
66          */
67         public final function setAmount ($amount) {
68                 $this->amount = (float) $amount;
69         }
70
71         /**
72          * Getter for amount
73          *
74          * @return      $amount         Amount of points to store
75          */
76         public final function getAmount () {
77                 return $this->amount;
78         }
79
80         /**
81          * Checks wether the user has the required amount of points left for the specified action
82          *
83          * @param       $action                 The action or configuration entry plus prefix the user wants to perform
84          * @return      $hasRequired    Wether the user has the required points
85          * @todo        Finish loading part of points
86          */
87         public function ifUserHasRequiredPoints ($action) {
88                 // Default is that everyone is poor... ;-)
89                 $hasRequired = false;
90
91                 // Get the required points entry
92                 $requiredPoints = $this->getConfigInstance()->readConfig($action . '_action_points');
93
94                 // Now get a search criteria and set the user's name as criteria
95                 $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
96                 $searchInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS_UID, $this->getUserInstance()->getUserId());
97                 $searchInstance->setLimit(1);
98
99                 // Get a wrapper instance
100                 $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_points_db_wrapper_class');
101
102                 // Get result back
103                 $resultInstance = $wrapperInstance->doSelectByCriteria($searchInstance);
104
105                 // Do we have an entry?
106                 if ($resultInstance->next()) {
107                         // @TODO Load points here
108                         $this->partialStub("Load points here for comparison.");
109                 } // END - if
110
111                 // Return the result
112                 return $hasRequired;
113         }
114
115         /**
116          * "Books" the given points amount on the current user's account
117          *
118          * @param       $amount         Amount of points we shall book
119          * @return      void
120          */
121         function bookPointsDirectly ($amount) {
122                 // Get a critieria instance
123                 $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
124
125                 // Add search criteria
126                 $searchInstance = ObjectFactory::createObjectByConfiguredName('search_criteria_class');
127                 $searchInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS_UID, $this->getUserInstance()->getUserId());
128                 $searchInstance->setLimit(1);
129
130                 // Get a wrapper instance
131                 $wrapperInstance = ObjectFactory::createObjectByConfiguredName('user_points_db_wrapper_class');
132
133                 // Get result back
134                 $resultInstance = $wrapperInstance->doSelectByCriteria($searchInstance);
135
136                 // Do we have an entry?
137                 if ($resultInstance->next()) {
138                         // Get the entry
139                         $entry = $resultInstance->current();
140
141                         // Add the points
142                         $amount += $entry[UserPointsDatabaseWrapper::DB_COLUMN_POINTS];
143
144                         // Now get another criteria
145                         $updateInstance = ObjectFactory::createObjectByConfiguredName('update_criteria_class');
146
147                         // And add our both entries
148                         $updateInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS, $amount);
149
150                         // Add the search criteria for searching for the right entry
151                         $updateInstance->setSearchInstance($searchInstance);
152
153                         // Set wrapper class name
154                         $updateInstance->setWrapperConfigEntry('user_points_db_wrapper_class');
155
156                         // Remember the update in database result
157                         $resultInstance->add2UpdateQueue($updateInstance);
158
159                         // Set it
160                         $this->setResultInstance($resultInstance);
161                 } else {
162                         // Set the amount in class
163                         $this->setAmount($amount);
164
165                         // Create the new entry
166                         $wrapperInstance->insertUserPoints($this);
167                 }
168         }
169
170         /**
171          * Adds registration elements to a given dataset instance
172          *
173          * @param       $criteriaInstance       An instance of a storeable criteria
174          * @return      void
175          */
176         public function addElementsToDataSet (StoreableCriteria $criteriaInstance) {
177                 // Add user id
178                 $criteriaInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS_UID, $this->getUserInstance()->getUserId());
179
180                 // Add amount
181                 $criteriaInstance->addCriteria(UserPointsDatabaseWrapper::DB_COLUMN_POINTS, $this->getAmount());
182         }
183 }
184
185 // [EOF]
186 ?>