0) { $cond = " AND $cond"; } $sql = sprintf("SELECT TOP 1 [FirstName] AS firstName, [LastName] AS lastName, [DisplayName] AS displayName, [UserDefined1] AS freeOne, [ActualAddressID] AS addressId, [Email] AS mail, [TelephoneMobile] AS mobilePhone, [TelephonePrivate] AS privatePhone, [Telephone] AS officePhone, [UserAccountID] AS id, REPLACE(UserAccountNr, ' ', '') AS login FROM [UserAccounts] AS u LEFT JOIN [Addresses] AS a ON a.[AddressID] = u.[ActualAddressID] WHERE LTRIM(RTRIM(UserAccountNr)) = '%s' AND disabled = 1 %s;", $login, $cond); $results = Connection::execute($sql, $raiseError); return $results->current() !== false ? new User($results->current()) : null; } /** * Circulations as needed for the BSR internal tools */ public function GetCirculations() { $sql = sprintf("SELECT n.NoticeID, ItemNr, LTRIM(RTRIM(n.NoticeNr)) AS code, LTRIM(RTRIM(n.Title)) AS Title, LTRIM(RTRIM(n.Author)) AS author, Fields.[300] AS media, Fields.[901] AS readBy FROM Circulations AS c INNER JOIN Items AS i ON i.ItemId = c.ItemId INNER JOIN Notices AS n ON n.NoticeID = i.NoticeID LEFT OUTER JOIN ( SELECT * FROM ( SELECT NoticeID, Tag AS Field, NoticeFields.ContentShortPart AS Data FROM NoticeFields WHERE Tag IN ('901', '300') ) AS src PIVOT ( MIN(Data) FOR Field IN ([901], [300]) ) AS pvt ) Fields ON n.NoticeID = Fields.NoticeID WHERE c.UserAccountID = %s ORDER BY ItemNr ASC", $this->id); $result = Connection::execute($sql); return $result ? $result->to_array() : array(); } public function getLoansData($table, $sort = "ItemNr ASC") { $sql = sprintf("SELECT n.NoticeId, n.NoticeNr, CheckOutDate, ItemNr FROM %s AS c INNER JOIN Items AS i ON i.ItemId = c.ItemId INNER JOIN Notices AS n ON n.NoticeID = i.NoticeID WHERE c.UserAccountID = %s ORDER BY %s", $table, $this->id, $sort); return Connection::execute($sql)->to_array(); } private function _getLoans($table, $count, $sort) { $circulations = $this->getLoansData($table, $sort); // getting the intval of the NoticeNr will remove any 'V' or 'T' and thus we will have no issues with // the virtual books that are used for Downloads and so. $codes = array_unique(array_map(function($c) { return intval(trim($c['NoticeNr'])); }, $circulations)); if($count) { return count($circulations); } $books = count($codes) > 0 ? BookSearch::GetBooks($codes) : array(); foreach($circulations as $c) { $id = $c['NoticeID']; if(isset($books[$id])) { $books[$id]['date'] = $c['CheckOutDate']; $books[$id]['itemNr'] = $c['ItemNr']; } } return $books; } /** * Loans (Circulations) as needed on the website * @param boolean $count return only the count * @return array */ public function GetLoans($count = false) { return $this->_getLoans('Circulations', $count, "ItemNr ASC"); } /** * Old loans (OldCirculations) as needed on the website * @param boolean $count return only the count * @return array */ public function GetOldLoans($count = false) { return $this->_getLoans('OldCirculations', $count, 'CheckOutDate DESC'); } /** * Add a book to the wish list if it is not already inside. * @param string $noticeNr * @return bool */ public function addWish($noticeNr) { if ($this->hasWish($noticeNr)) { return false; } $sql = "UPDATE Counters SET WishID = WishID + 1 OUTPUT INSERTED.WishID;"; $result = Connection::execute($sql, true); $row = $result->current(); $employee_id = Configuration::get('www_employee_id'); $library_id = Configuration::get('www_library_id'); $sql = sprintf("INSERT INTO Wishes (WishID, NoticeID, UserAccountID, CreationDate, EmployeeID, BranchOfficeID, Remark, ModificationDate) SELECT %s , NoticeID, %s, GETDATE() , %s , %s , '' , GETDATE() FROM Notices WHERE LTRIM(RTRIM(NoticeNr)) = '%s';", $row['WishID'], $this->id, $employee_id, $library_id, $noticeNr); $status = Connection::execute($sql); return $status && ! $status->is_error() && $status->get_num_rows() > 0; } /** * Return true if the book is in the wish list * @param string $noticeNr * @return bool */ private function hasWish($noticeNr) { $sql = sprintf("SELECT w.NoticeID FROM Wishes AS w INNER JOIN Notices AS n ON n.NoticeID = w.NoticeID WHERE LTRIM(RTRIM(n.NoticeNr)) = '%s' AND w.UserAccountID = %s;", $noticeNr, $this->id); $result = Connection::execute($sql); return $result->current() !== false; } /** * Wishes are all the books that this user want to read. * @param boolean $count return only the count * @param int $limit * @return array */ public function getWishes($count = false, $limit = 50) { $sql = sprintf("SELECT TOP $limit NoticeID FROM Wishes WHERE UserAccountID = %s ORDER BY CreationDate DESC", $this->id); $result = Connection::execute($sql); $ids = array_map(function($r) { return $r['NoticeID']; }, $result->to_array()); if($count) { return count($ids); } return BookSearch::GetBooks($ids, 'id'); } /** * Remove a book from the wish list * @param string $noticeNr * @return boolean Was the deletion was successful or not ? */ public function deleteWish($noticeNr) { $sql = sprintf("DELETE w FROM Wishes AS w INNER JOIN Notices AS n ON n.NoticeID = w.NoticeID WHERE LTRIM(RTRIM(n.NoticeNr)) = '%s' AND UserAccountID = %s;", $noticeNr, $this->id); $status = Connection::execute($sql, true); return $status && ! $status->is_error() && $status->get_num_rows() > 0; } }