mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 09:42:10 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			482 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			482 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
class User
 | 
						|
{
 | 
						|
	private $id;
 | 
						|
	public $email;
 | 
						|
	private $pwd_hash;
 | 
						|
	public $surname;
 | 
						|
	public $first_name;
 | 
						|
	public $birth_date;
 | 
						|
	public $gender;
 | 
						|
	public $address;
 | 
						|
	public $postal_code;
 | 
						|
	public $city;
 | 
						|
	public $country;
 | 
						|
	public $phone_number;
 | 
						|
	public $school;
 | 
						|
	public $class;
 | 
						|
	public $responsible_name;
 | 
						|
	public $responsible_phone;
 | 
						|
	public $responsible_email;
 | 
						|
	public $description;
 | 
						|
	private $role;
 | 
						|
	private $team_id;
 | 
						|
	private $year;
 | 
						|
	private $confirm_email;
 | 
						|
	private $forgotten_password;
 | 
						|
	private $inscription_date;
 | 
						|
	
 | 
						|
	private function __construct() {}
 | 
						|
 | 
						|
	public static function fromId($id)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$req = $DB->prepare("SELECT * FROM `users` WHERE `id` = ?;");
 | 
						|
		$req->execute([htmlspecialchars($id)]);
 | 
						|
		$data = $req->fetch();
 | 
						|
 | 
						|
		if ($data === false)
 | 
						|
			return null;
 | 
						|
 | 
						|
		$user = new User();
 | 
						|
		$user->fill($data);
 | 
						|
		return $user;
 | 
						|
	}
 | 
						|
 | 
						|
	public static function fromEmail($email)
 | 
						|
	{
 | 
						|
		global $DB, $YEAR;
 | 
						|
		$req = $DB->prepare("SELECT * FROM `users` WHERE `email` = ? AND `year` = $YEAR;");
 | 
						|
		$req->execute([htmlspecialchars($email)]);
 | 
						|
		$data = $req->fetch();
 | 
						|
 | 
						|
		if ($data === false)
 | 
						|
			return null;
 | 
						|
 | 
						|
		$user = new User();
 | 
						|
		$user->fill($data);
 | 
						|
		return $user;
 | 
						|
	}
 | 
						|
	
 | 
						|
	private function fill($data)
 | 
						|
	{
 | 
						|
		$this->id = $data["id"];
 | 
						|
		$this->email = $data["email"];
 | 
						|
		$this->pwd_hash = $data["pwd_hash"];
 | 
						|
		$this->surname = $data["surname"];
 | 
						|
		$this->first_name = $data["first_name"];
 | 
						|
		$this->birth_date = $data["birth_date"];
 | 
						|
		$this->gender = $data["gender"];
 | 
						|
		$this->address = $data["address"];
 | 
						|
		$this->postal_code = $data["postal_code"];
 | 
						|
		$this->city = $data["city"];
 | 
						|
		$this->country = $data["country"];
 | 
						|
		$this->phone_number = $data["phone_number"];
 | 
						|
		$this->school = $data["school"];
 | 
						|
		$this->class = SchoolClass::fromName($data["class"]);
 | 
						|
		$this->responsible_name = $data["responsible_name"];
 | 
						|
		$this->responsible_phone = $data["responsible_phone"];
 | 
						|
		$this->responsible_email = $data["responsible_email"];
 | 
						|
		$this->description = $data["description"];
 | 
						|
		$this->role = Role::fromName($data["role"]);
 | 
						|
		$this->team_id = $data["team_id"];
 | 
						|
		$this->year = $data["year"];
 | 
						|
		$this->confirm_email = $data["confirm_email"];
 | 
						|
		$this->forgotten_password = $data["forgotten_password"];
 | 
						|
		$this->inscription_date = $data["inscription_date"];
 | 
						|
	}
 | 
						|
	public static function getOrganizers()
 | 
						|
	{
 | 
						|
		global $DB, $YEAR;
 | 
						|
		$admins = [];
 | 
						|
		$req = $DB->query("SELECT * FROM `users` WHERE `role` = 'ORGANIZER' OR `role` = 'ADMIN' AND `year` = $YEAR ORDER BY `role` DESC, `surname`, `first_name`;");
 | 
						|
 | 
						|
		while (($data = $req->fetch()) !== false) {
 | 
						|
			$admin = new User();
 | 
						|
			$admin->fill($data);
 | 
						|
			$admins[] = $admin;
 | 
						|
		}
 | 
						|
 | 
						|
		return $admins;
 | 
						|
	}
 | 
						|
 | 
						|
	public static function getAdmins()
 | 
						|
	{
 | 
						|
		global $DB, $YEAR;
 | 
						|
		$users = [];
 | 
						|
		$req = $DB->query("SELECT * FROM `users` WHERE (`role` = 'ADMIN') "
 | 
						|
			. "AND `year` = $YEAR ORDER BY `role`, `inscription_date`;");
 | 
						|
 | 
						|
		while (($data = $req->fetch()) !== false) {
 | 
						|
			$orphan = new User();
 | 
						|
			$orphan->fill($data);
 | 
						|
			$users[] = $orphan;
 | 
						|
		}
 | 
						|
 | 
						|
		return $users;
 | 
						|
	}
 | 
						|
 | 
						|
	public static function getAllUsers()
 | 
						|
	{
 | 
						|
		global $DB, $YEAR;
 | 
						|
		$users = [];
 | 
						|
		$req = $DB->query("SELECT * FROM `users` WHERE (`role` = 'PARTICIPANT' OR `role` = 'ENCADRANT') "
 | 
						|
			. "AND `year` = $YEAR ORDER BY `role`, `inscription_date`;");
 | 
						|
 | 
						|
		while (($data = $req->fetch()) !== false) {
 | 
						|
			$orphan = new User();
 | 
						|
			$orphan->fill($data);
 | 
						|
			$users[] = $orphan;
 | 
						|
		}
 | 
						|
 | 
						|
		return $users;
 | 
						|
	}
 | 
						|
 | 
						|
	public static function getOrphanUsers()
 | 
						|
	{
 | 
						|
		global $DB, $YEAR;
 | 
						|
		$orphans = [];
 | 
						|
		$req = $DB->query("SELECT * FROM `users` WHERE `role` != 'ADMIN' AND `team_id` IS NULL "
 | 
						|
			. "AND `year` = $YEAR ORDER BY `role`, `inscription_date`;");
 | 
						|
 | 
						|
		while (($data = $req->fetch()) !== false) {
 | 
						|
			$orphan = new User();
 | 
						|
			$orphan->fill($data);
 | 
						|
			$orphans[] = $orphan;
 | 
						|
		}
 | 
						|
 | 
						|
		return $orphans;
 | 
						|
	}
 | 
						|
 | 
						|
	public function getEmail()
 | 
						|
	{
 | 
						|
		return $this->email;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setEmail($email)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->email = $email;
 | 
						|
		$DB->prepare("UPDATE `users` SET `email` = ? WHERE `id` = ?;")->execute([$email, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getId()
 | 
						|
	{
 | 
						|
		return $this->id;
 | 
						|
	}
 | 
						|
 | 
						|
	public function checkPassword($password)
 | 
						|
	{
 | 
						|
		return password_verify($password, $this->pwd_hash);
 | 
						|
	}
 | 
						|
 | 
						|
	public function setPassword($password)
 | 
						|
	{
 | 
						|
		$this->setPasswordHash(password_hash($password, PASSWORD_BCRYPT));
 | 
						|
	}
 | 
						|
 | 
						|
	private function setPasswordHash($password_hash)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->pwd_hash = $password_hash;
 | 
						|
		$DB->prepare("UPDATE `users` SET `pwd_hash` = ? WHERE `id` = ?;")->execute([$password_hash, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getSurname()
 | 
						|
	{
 | 
						|
		return $this->surname;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setSurname($surname)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->surname = $surname;
 | 
						|
		$DB->prepare("UPDATE `users` SET `surname` = ? WHERE `id` = ?;")->execute([$surname, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getFirstName()
 | 
						|
	{
 | 
						|
		return $this->first_name;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setFirstName($first_name)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->first_name = $first_name;
 | 
						|
		$DB->prepare("UPDATE `users` SET `first_name` = ? WHERE `id` = ?;")->execute([$first_name, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getBirthDate()
 | 
						|
	{
 | 
						|
		return $this->birth_date;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setBirthDate($birth_date)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->birth_date = $birth_date;
 | 
						|
		$DB->prepare("UPDATE `users` SET `birth_date` = ? WHERE `id` = ?;")->execute([$birth_date, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getGender()
 | 
						|
	{
 | 
						|
		return $this->gender;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setGender($gender)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->gender = $gender;
 | 
						|
		$DB->prepare("UPDATE `users` SET `gender` = ? WHERE `id` = ?;")->execute([$gender, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getAddress()
 | 
						|
	{
 | 
						|
		return $this->address;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setAddress($address)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->address = $address;
 | 
						|
		$DB->prepare("UPDATE `users` SET `address` = ? WHERE `id` = ?;")->execute([$address, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getPostalCode()
 | 
						|
	{
 | 
						|
		return $this->postal_code;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setPostalCode($postal_code)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->postal_code = $postal_code;
 | 
						|
		$DB->prepare("UPDATE `users` SET `postal_code` = ? WHERE `id` = ?;")->execute([$postal_code, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getCity()
 | 
						|
	{
 | 
						|
		return $this->city;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setCity($city)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->city = $city;
 | 
						|
		$DB->prepare("UPDATE `users` SET `city` = ? WHERE `id` = ?;")->execute([$city, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getCountry()
 | 
						|
	{
 | 
						|
		return $this->country;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setCountry($country)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->country = $country;
 | 
						|
		$DB->prepare("UPDATE `users` SET `country` = ? WHERE `id` = ?;")->execute([$country, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getPhoneNumber()
 | 
						|
	{
 | 
						|
		return $this->phone_number;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setPhoneNumber($phone_number)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->phone_number = $phone_number;
 | 
						|
		$DB->prepare("UPDATE `users` SET `phone_number` = ? WHERE `id` = ?;")->execute([$phone_number, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getSchool()
 | 
						|
	{
 | 
						|
		return $this->school;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setSchool($school)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->school = $school;
 | 
						|
		$DB->prepare("UPDATE `users` SET `school` = ? WHERE `id` = ?;")->execute([$school, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getClass()
 | 
						|
	{
 | 
						|
		return $this->class;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setClass($class)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->class = $class;
 | 
						|
		$DB->prepare("UPDATE `users` SET `class` = ? WHERE `id` = ?;")->execute([SchoolClass::getName($class), $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getResponsibleName()
 | 
						|
	{
 | 
						|
		return $this->responsible_name;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setResponsibleName($responsible_name)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->responsible_name = $responsible_name;
 | 
						|
		$DB->prepare("UPDATE `users` SET `responsible_name` = ? WHERE `id` = ?;")->execute([$responsible_name, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getResponsiblePhone()
 | 
						|
	{
 | 
						|
		return $this->responsible_phone;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setResponsiblePhone($responsible_phone)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->responsible_phone = $responsible_phone;
 | 
						|
		$DB->prepare("UPDATE `users` SET `responsible_phone` = ? WHERE `id` = ?;")->execute([$responsible_phone, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getResponsibleEmail()
 | 
						|
	{
 | 
						|
		return $this->responsible_email;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setResponsibleEmail($responsible_email)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->responsible_email = $responsible_email;
 | 
						|
		$DB->prepare("UPDATE `users` SET `responsible_email` = ? WHERE `id` = ?;")->execute([$responsible_email, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getDescription()
 | 
						|
	{
 | 
						|
		return $this->description;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setDescription($desc)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->description = $desc;
 | 
						|
		$DB->prepare("UPDATE `users` SET `description` = ? WHERE `id` = ?;")->execute([$desc, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getRole()
 | 
						|
	{
 | 
						|
		return $this->role;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setRole($role)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->role = $role;
 | 
						|
		/** @noinspection PhpUndefinedMethodInspection */
 | 
						|
		$DB->prepare("UPDATE `users` SET `role` = ? WHERE `id` = ?;")->execute([Role::getName($role), $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getTeamId()
 | 
						|
	{
 | 
						|
		return $this->team_id;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setTeamId($team_id)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->team_id = $team_id;
 | 
						|
		$DB->prepare("UPDATE `users` SET `team_id` = ? WHERE `id` = ?;")->execute([$team_id, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getYear()
 | 
						|
	{
 | 
						|
		return $this->year;
 | 
						|
	}
 | 
						|
 | 
						|
	public function getConfirmEmailToken()
 | 
						|
	{
 | 
						|
		return $this->confirm_email;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setConfirmEmailToken($token)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->confirm_email = $token;
 | 
						|
		$DB->prepare("UPDATE `users` SET `confirm_email` = ? WHERE `id` = ?;")->execute([$token, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getForgottenPasswordToken()
 | 
						|
	{
 | 
						|
		return $this->forgotten_password;
 | 
						|
	}
 | 
						|
 | 
						|
	public function setForgottenPasswordToken($token)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$this->forgotten_password = $token;
 | 
						|
		$DB->prepare("UPDATE `users` SET `forgotten_password` = ? WHERE `id` = ?;")->execute([$token, $this->getId()]);
 | 
						|
	}
 | 
						|
 | 
						|
	public function getInscriptionDate()
 | 
						|
	{
 | 
						|
		return $this->inscription_date;
 | 
						|
	}
 | 
						|
 | 
						|
	public function getAllDocuments($tournament_id)
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$req = $DB->query("SELECT * FROM `documents` AS `t1` "
 | 
						|
			. "INNER JOIN (SELECT `user`, `type`, `tournament`, MAX(`uploaded_at`) AS `last_upload`, COUNT(`team`) AS `version` FROM `documents` GROUP BY `tournament`, `type`, `user`) `t2` "
 | 
						|
				. "ON `t1`.`user` = `t2`.`user` AND `t1`.`type` = `t2`.`type` AND `t1`.`tournament` = `t2`.`tournament` "
 | 
						|
				. "WHERE `t1`.`uploaded_at` = `t2`.`last_upload` AND `t1`.`tournament` = $tournament_id AND `t1`.`user` = $this->id ORDER BY `t1`.`type`;");
 | 
						|
 | 
						|
		$docs = [];
 | 
						|
 | 
						|
		while (($data = $req->fetch()) !== false)
 | 
						|
			$docs[] = Document::fromData($data);
 | 
						|
 | 
						|
		if ($this->team_id > 0) {
 | 
						|
			$req = $DB->query("SELECT * FROM `documents` AS `t1` "
 | 
						|
				. "INNER JOIN (SELECT `user`, `type`, `tournament`, MAX(`uploaded_at`) AS `last_upload`, COUNT(`team`) AS `version` FROM `documents` GROUP BY `tournament`, `type`, `user`) `t2` "
 | 
						|
				. "ON `t1`.`user` = `t2`.`user` AND `t1`.`type` = `t2`.`type` AND `t1`.`tournament` = `t2`.`tournament` "
 | 
						|
				. "WHERE `t1`.`uploaded_at` = `t2`.`last_upload` AND `t1`.`tournament` = $tournament_id AND `t1`.`team` = $this->team_id "
 | 
						|
				. "AND `t1`.`type` = 'MOTIVATION_LETTER';");
 | 
						|
 | 
						|
			while (($data = $req->fetch()) !== false)
 | 
						|
				$docs[] = Document::fromData($data);
 | 
						|
		}
 | 
						|
 | 
						|
		return $docs;
 | 
						|
	}
 | 
						|
 | 
						|
	public function getPayment() {
 | 
						|
	    global $DB;
 | 
						|
 | 
						|
	    $team = Team::fromId($this->team_id);
 | 
						|
	    $tournament = $team->getEffectiveTournament();
 | 
						|
 | 
						|
	    $req = $DB->prepare("SELECT `id` FROM `payments` WHERE `user` = ? AND `tournament` = ?;");
 | 
						|
	    $req->execute([$this->id, $tournament->getId()]);
 | 
						|
 | 
						|
	    if (($data = $req->fetch()) !== false)
 | 
						|
	        return Payment::fromId($data["id"]);
 | 
						|
 | 
						|
	    $req = $DB->prepare("INSERT INTO `payments`(`user`, `tournament`, `amount`, `method`, `transaction_infos`, `validation_status`) VALUES (?, ?, ?, ?, ?, ?);");
 | 
						|
	    $req->execute([$this->id, $tournament->getId(), 0, PaymentMethod::getName(PaymentMethod::NOT_PAID), "L'inscription n'est pas encore payée.", ValidationStatus::getName(ValidationStatus::NOT_READY)]);
 | 
						|
 | 
						|
	    return $this->getPayment();
 | 
						|
	}
 | 
						|
 | 
						|
	public function getOrganizedTournaments()
 | 
						|
	{
 | 
						|
		global $DB;
 | 
						|
		$req = $DB->query("SELECT `tournament` FROM `organizers` JOIN `tournaments` ON `tournaments`.`id` = `tournament` WHERE `organizer` = $this->id ORDER BY `date_start`, `name`;");
 | 
						|
 | 
						|
		$tournaments = [];
 | 
						|
 | 
						|
		while (($data = $req->fetch()) !== false)
 | 
						|
			$tournaments[] = Tournament::fromId($data["tournament"]);
 | 
						|
 | 
						|
		return $tournaments;
 | 
						|
	}
 | 
						|
} |