diff --git a/homepage/participo/lib/participoLib/user.php b/homepage/participo/lib/participoLib/user.php index 9f62943..3badb82 100644 --- a/homepage/participo/lib/participoLib/user.php +++ b/homepage/participo/lib/participoLib/user.php @@ -241,14 +241,18 @@ SQL; return $this->name; } - public function getFirstname() + public function getFirstName() { return $this->firstName; } public function getConfig() { - return $this->config; + return $this->$config; + } + + public function getStrBirthday(){ + return $this->dateOfBirth->format("Y-m-d"); } // static functions @@ -325,4 +329,34 @@ SQL; } return User::fromDbArray($response[0]); } + + public static function loadFromDbByAttribute(int $attributeId){ + $query = + "SELECT DISTINCT" . + " `wkParticipo_Users`.* " . + " FROM `wkParticipo_Users`" . + " JOIN `wkParticipo_user<=>userAttributes`" . + " ON `wkParticipo_user<=>userAttributes`.`userId` = `wkParticipo_Users`.`id`" . + " WHERE `wkParticipo_user<=>userAttributes`.`attributeId` = :attributeId". + " ORDER BY `wkParticipo_Users`.`id` ASC;"; + + $response = dbConnector::query( + $query + , [ + 'attributeId'=>[ + 'value'=>filterId($attributeId) + , 'data_type'=>PDO::PARAM_INT] + ] + ); + + // Postprocessing + // - convert the comma separated list into an array + foreach ($response as &$user) { + $user["eMail"] = explode(",", $user["eMail"]); + foreach ($user["eMail"] as &$email) { + $email = trim($email); + } + } + return $response; + } } diff --git a/homepage/participo/pmelo.inc.php b/homepage/participo/pmelo.inc.php index 7f83ea7..1eb4ab4 100644 --- a/homepage/participo/pmelo.inc.php +++ b/homepage/participo/pmelo.inc.php @@ -38,17 +38,20 @@ class PmElo{ } } - if(!is_file("pmeloRanking.json")){ - $this->log['info'][] = "Couldn't find `pmeloRanking.json`. Create a new one!"; - file_put_contents("pmeloRanking.json", json_encode([])); + // load/recreate ranking data + if(!is_file(self::$pmeloJson)){ + $this->log['info'][] = "Couldn't find `".self::$pmeloJson."`. Create a new one!"; + file_put_contents(self::$pmeloJson, json_encode([])); } // init members $this->trainees = self::getTrainees(); + $this->var_log(array_map(function($user){return $user->getFirstName();},$this->trainees), "trainees from db"); $this->rankings = self::createRankings(); } + // load all active trainees into a id=>User assoc array public static function getTrainees(){ $traineeList = array_map('User::fromDbArray', User::dbSelectWithAttribute(4)); $traineeAssocArray = []; @@ -57,31 +60,51 @@ class PmElo{ } return $traineeAssocArray; } + + // load ranking from json file public static function loadRankings(){ - return json_decode(file_get_contents("pmeloRanking.json")); + return json_decode(file_get_contents(self::$pmeloJson)); } + + // save a ranking to json file public static function saveRankings(array $rankings){ - file_put_contents("pmeloRankings.json", json_encode($rankings)); + file_put_contents(self::$pmeloJson, json_encode($rankings)); + } + + function var_log($variable, string $prefix=null, string $logChannel='info'){ + if(!in_array($logChannel, ['info', 'warning', 'error'])){ + $logChannel='info'; + } + $prefix = (!empty($prefix) ? $prefix.": " : ""); + $this->log[$logChannel][]=$prefix.var_export($variable, true); } public function createRankings(){ // load the last state of the ranking $loadedRanking = self::loadRankings(); + $this->var_log($loadedRanking,"ranking"); // check if the ranked trainees still are in training $cleanRanking = []; - $toBeInsertedTrainees = []; + $toBeInsertedTrainees = $this->trainees; foreach($loadedRanking as $rank=>$id){ if(array_key_exists($id, $this->trainees)){ $cleanRanking[] = $id; - continue; + // id of the not in the ranking, we have to insert + unset($toBeInsertedTrainees[$id]); } - // id of the not in the ranking, we have to insert - $toBeInsertedTrainees[$id] = $this->trainees[$id]; } - usort($toBeInsertedTrainees, function($lhs, $rhs){return $lhs < $rhs ? -1 : 1;}); - var_dump($toBeInsertedTrainees); + $newTraineesIds = array_map(function($u){return $u->getId();},$toBeInsertedTrainees); + usort( + $newTraineesIds + , function($lhs, $rhs){ + return $this->trainees[$lhs]->getStrBirthday() < $this->trainees[$rhs]->getStrBirthday() ? -1 : ($this->trainees[$lhs]->getStrBirthday() > $this->trainees[$rhs]->getStrBirthday() ? 1 : 0); + } + ); + $this->var_log(array_map(function($id){return $this->trainees[$id]->getStrBirthday();},$newTraineesIds), "newTrainieesIdsByAge"); + $this->var_log($newTraineesIds, "newTrainieesIdsByAge"); + $this->var_log(array_map(function($user){return $user->getFirstName();}, $toBeInsertedTrainees), "newTrainees"); // insert new trainees in the ranking // foreach($this->trainees as $trainee){ @@ -96,4 +119,6 @@ class PmElo{ public $trainees = null; // list of id-s in the order of the current ranking public $rankings = null; + + static $pmeloJson="pmeloRanking.json"; } \ No newline at end of file diff --git a/homepage/participo/pmelo.php b/homepage/participo/pmelo.php index f7157ec..253fa36 100644 --- a/homepage/participo/pmelo.php +++ b/homepage/participo/pmelo.php @@ -69,7 +69,7 @@