. */ /** * An interface to the assignment table in the database */ class Assignment { use Calculatable; /** * @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 //------------------------------------------------------------------------------ protected function calculateSubtotal() { return $this->getHours() * $this->getPricePerHour(); } protected function calculateVAT() { return $this->calculateSubtotal() * $this->getVAT() / 100; } /** * 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; } } }