. */ /** * An interface to the assignment table in the database */ class assignment { /** * @var pdo $pdo The PDO class for database communication * @var int $id The id of the assignment * @var int $offerId The id of the offer this assignment is linked to * @var string $title The title of the assignment * @var string $description The description of the assignment * @var int $hours The amount of hours of the assignment * @var float $price_per_hour The price per hour for this assignment, in your valuta * @var float $vat The percentage of VAT to calculate on this assignment */ protected $pdo, $offerId, $id, $title, $description, $hours, $price_per_hour, $vat; const SUBTOTAL = 1; const VAT = 2; const TOTAL = 3; /** * Create a new instance * * @param PDO $pdo The PDO class, to access the database * @param int $id The id of the assignment to fetch * * @throws PDOException If something went wrong with the database * @throws Exception If the assignment could not be found */ public function __construct($pdo, $id) { $this->pdo = $pdo; $stmt = $this->pdo->prepare("SELECT * FROM `".constants::db_prefix."assignment` WHERE `id`=?"); $stmt->execute(array($id)); if ($stmt->rowCount() == 0) { throw new Exception("The assignment with id '$id' could not be found."); } $assignment = $stmt->fetch(PDO::FETCH_ASSOC); $this->id = $assignment['id']; $this->offerId = $assignment['offerId']; $this->title = $assignment['title']; $this->description = $assignment['description']; $this->hours = $assignment['hours']; $this->price_per_hour = $assignment['price_per_hour']; $this->vat = $assignment['VAT_percentage']; } //------------------------------------------------------------------------------ // Getters and setters //------------------------------------------------------------------------------ /** * Get the ID of the assignment * * @return int The ID */ public function getId() { return $this->id; } /** * Get the ID of the offer that this assignment is linked to * * @return int The ID */ public function getOfferId() { return $this->offerId; } /** * Get the offer that this assignment is linked to * * @return offer The offer */ public function getOffer() { return new offer($this->pdo, $this->offerId); } /** * Get the title of the assignment * * @return string The title */ public function getTitle() { return $this->title; } /** * Set the title of the assignment * * @param string $title The new title for the assignment * * @throws PDOException If something went wrong with the database * * @return bool True on succes, false on failure */ public function setTitle($title) { $stmt = $this->pdo->prepare("UPDATE `".constants::db_prefix."assignment` SET `title`=? WHERE `id`=?"); $stmt->execute(array($title, $this->id)); if ($stmt->rowCount() == 1) { $this->title = $title; return true; } else { return false; } } /** * Get the description of the assignment * * @param bool $parseMarkdown Whether or not to parse markdown * * @return string The description */ public function getDescription($parseMarkdown = true) { if ($parseMarkdown) { $pd = new Parsedown; return $pd->text($this->description); } else { return $this->description; } } /** * Set the description of the assignment * * @param string $description The new description for the assignment * * @throws PDOException If something went wrong with the database * * @return bool True on succes, false on failure */ public function setDescription($description) { $stmt = $this->pdo->prepare("UPDATE `".constants::db_prefix."assignment` SET `description`=? WHERE `id`=?"); $stmt->execute(array($description, $this->id)); if ($stmt->rowCount() == 1) { $this->description = $description; return true; } else { return false; } } /** * Get the amount of hours of the assignment * * @return int The amount of hours */ public function getHours() { return $this->hours; } /** * Set the amount of hours of the assignment * * @param int $hours The new amount hours for the assignment * * @throws PDOException If something went wrong with the database * * @return bool True on succes, false on failure */ public function setHours($hours) { $stmt = $this->pdo->prepare("UPDATE `".constants::db_prefix."assignment` SET `hours`=? WHERE `id`=?"); $stmt->execute(array($hours, $this->id)); if ($stmt->rowCount() == 1) { $this->hours = $hours; return true; } else { return false; } } /** * Get the price per hour of the assignment * * @return float The price per hour */ public function getPricePerHour() { return $this->price_per_hour; } /** * Set the price per hour of the assignment * * @param float $price_per_hour The new price per hour for the assignment * * @throws PDOException If something went wrong with the database * * @return bool True on succes, false on failure */ public function setPricePerHour($price_per_hour) { $stmt = $this->pdo->prepare("UPDATE `".constants::db_prefix."assignment` SET `price_per_hour`=? WHERE `id`=?"); $stmt->execute(array($price_per_hour, $this->id)); if ($stmt->rowCount() == 1) { $this->price_per_hour = $price_per_hour; return true; } else { return false; } } /** * Get the VAT percentage of the assignment * * @return float The VAT percentage */ public function getVAT() { return $this->vat; } /** * Set the VAT percentage of the assignment * * @param float $vat The new VAT percentage for the assignment * * @throws PDOException If something went wrong with the database * * @return bool True on succes, false on failure */ public function setVAT($vat) { $stmt = $this->pdo->prepare("UPDATE `".constants::db_prefix."assignment` SET `VAT_percentage`=? WHERE `id`=?"); $stmt->execute(array($vat, $this->id)); if ($stmt->rowCount() == 1) { $this->vat = $vat; return true; } else { return false; } } //------------------------------------------------------------------------------ // Other functions //------------------------------------------------------------------------------ /** * Calculate useful numbers about the assignment * * Subtotal: price_per_hour \* hours * * VAT: subtotal \* VAT_percentage * * Total: subtotal + VAT * * @param int $what Any of assignment::SUBTOTAL, assignment::VAT, assignment::TOTAL * @param int $round How many decimals to round on * @param bool $format Whether to format the number nicely (for output) or not (for calculations) * * @throws PDOException If something went wrong with the database * * @return float|bool The calculated value rounded on $round decimals, or false when the input is incorrect */ public function calculate($what = self::TOTAL, $round = 2, $format = true) { $return = 0; switch ($what) { case self::SUBTOTAL: $return = $this->getPricePerHour() * $this->getHours(); break; case self::VAT: $return = $this->calculate(self::SUBTOTAL, $round + 1, false) * $this->getVAT() / 100; break; case self::TOTAL: $return = $this->calculate(self::SUBTOTAL, $round + 1, false) + $this->calculate(self::VAT, $round + 1, false); break; default: return false; } if ($format) { return number_format($return, $round); } else { return round($return, $round); } } /** * Remove this assignment from the database * * If this doesn't succeed (i.e. false is returned), that means the assignment was removed manually or by another instance of this class * * @throws PDOException If something went wrong with the database * * @return bool True on success, false on failure */ public function delete() { $stmt = $this->pdo->prepare("DELETE FROM `".constants::db_prefix."assignment` WHERE `id`=?"); $stmt->execute(array($this->id)); if ($stmt->rowCount() != 1) { return false; } else { return true; } } }