/home/techb158/ileadtechnology.com/SSM/app/Repositories/library
Edit: /home/techb158/ileadtechnology.com/SSM/app/Repositories/library/BookRepository.php (19589B)
book = $book;
$this->book_author = $book_author;
$this->book_language = $book_language;
$this->book_topic = $book_topic;
$this->book_publisher = $book_publisher;
$this->book_post = $book_post;
$this->book_post_detail = $book_post_detail;
$this->book_condition = $book_condition;
$this->book_log_detail = $book_log_detail;
}
/**
* Get book query
*
* @return Book query
*/
public function getQuery()
{
return $this->book;
}
/**
* Count book
*
* @return integer
*/
public function count()
{
return $this->book->count();
}
/**
* List all books by title & id
*
* @return array
*/
public function listAll()
{
return $this->book->get()->pluck('title', 'id')->all();
}
/**
* List all books by title & id for select option
*
* @return array
*/
public function selectAll()
{
return $this->book->all(['title','id']);
}
/**
* List all books by id
*
* @return array
*/
public function listId()
{
return $this->book->get()->pluck('id')->all();
}
/**
* Get all books
*
* @return array
*/
public function getAll()
{
return $this->book->all();
}
/**
* Find book with given id.
*
* @param integer $id
* @return Book
*/
public function find($id)
{
return $this->book->info()->filterById($id)->first();
}
/**
* Find book with given id or throw an error.
*
* @param integer $id
* @return Book
*/
public function findOrFail($id)
{
$book = $this->book->info()->filterById($id)->first();
if (! $book) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book')]);
}
return $book;
}
/**
* Find book with given uuid.
*
* @param string $uuid
* @return Book
*/
public function findByUuid($uuid)
{
return $this->book->info()->filterByUuid($id)->first();
}
/**
* Find book with given uuid or throw an error.
*
* @param string $uuid
* @return Book
*/
public function findByUuidOrFail($uuid)
{
$book = $this->book->info()->filterByUuid($uuid)->first();
if (! $book) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book')]);
}
return $book;
}
/**
* Get all filtered data
*
* @param array $params
* @return Book
*/
public function getData($params)
{
$sort_by = gv($params, 'sort_by', 'title');
$order = gv($params, 'order', 'asc');
$title = gv($params, 'title');
$book_author_id = gv($params, 'book_author_id');
$book_language_id = gv($params, 'book_language_id');
$book_topic_id = gv($params, 'book_topic_id');
$book_publisher_id = gv($params, 'book_publisher_id');
$book_author_id = is_array($book_author_id) ? $book_author_id : ($book_author_id ? explode(',', $book_author_id) : []);
$book_language_id = is_array($book_language_id) ? $book_language_id : ($book_language_id ? explode(',', $book_language_id) : []);
$book_topic_id = is_array($book_topic_id) ? $book_topic_id : ($book_topic_id ? explode(',', $book_topic_id) : []);
$book_publisher_id = is_array($book_publisher_id) ? $book_publisher_id : ($book_publisher_id ? explode(',', $book_publisher_id) : []);
$query = $this->book->info()->withCount(['bookPostDetails'])->filterByTitle($title);
if (count($book_author_id)) {
$query->whereIn('book_author_id', $book_author_id);
}
if (count($book_language_id)) {
$query->whereIn('book_language_id', $book_language_id);
}
if (count($book_topic_id)) {
$query->whereIn('book_topic_id', $book_topic_id);
}
if (count($book_publisher_id)) {
$query->whereIn('book_publisher_id', $book_publisher_id);
}
return $query->orderBy($sort_by, $order);
}
/**
* Paginate all books using given params.
*
* @param array $params
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function paginate($params)
{
$page_length = gv($params, 'page_length', config('config.page_length'));
return $this->getData($params)->paginate($page_length);
}
/**
* Get all filtered data for printing
*
* @param array $params
* @return Book
*/
public function print($params)
{
return $this->getData($params)->get();
}
/**
* Get book pre requisite.
*
* @return Array
*/
public function getPreRequisite()
{
$book_authors = $this->book_author->selectAll();
$book_languages = $this->book_language->selectAll();
$book_topics = $this->book_topic->selectAll();
$book_publishers = $this->book_publisher->selectAll();
return compact('book_authors', 'book_languages', 'book_topics', 'book_publishers');
}
/**
* Get book post pre requisite.
*
* @return Array
*/
public function getBookPostPreRequisite()
{
$book_conditions = $this->book_condition->selectAll();
return compact('book_conditions');
}
/**
* Get course filters.
*
* @return Array
*/
public function getFilters()
{
return $this->getPreRequisite();
}
/**
* Create a new book.
*
* @param array $params
* @return Book
*/
public function create($params)
{
return $this->book->forceCreate($this->formatParams($params));
}
/**
* Prepare given params for inserting into database.
*
* @param array $params
* @param string $type
* @return array
*/
private function formatParams($params, $book_id = null)
{
$title = gv($params, 'title');
$book_author_id = gv($params, 'book_author_id');
$book_language_id = gv($params, 'book_language_id');
$book_topic_id = gv($params, 'book_topic_id');
$book_publisher_id = gv($params, 'book_publisher_id');
$description = gv($params, 'description');
$this->book_author->findOrFail($book_author_id);
$this->book_language->findOrFail($book_language_id);
$this->book_topic->findOrFail($book_topic_id);
$this->book_publisher->findOrFail($book_publisher_id);
$book_exist_query = (! $book_id) ? $this->book : $this->book->where('id', '!=', $book_id);
$book_exists = $book_exist_query->filterByTitle($title, 1)->filterByBookAuthorId($book_author_id)->count();
if ($book_exists) {
throw ValidationException::withMessages(['name' => trans('library.book_exists')]);
}
$formatted = [
'title' => $title,
'isbn_number' => gv($params, 'isbn_number'),
'book_author_id' => $book_author_id,
'book_language_id' => $book_language_id,
'book_topic_id' => $book_topic_id,
'book_publisher_id' => $book_publisher_id,
'edition' => gv($params, 'edition'),
'page' => gv($params, 'page',0),
'price' => gv($params, 'price',0),
'type' => gv($params, 'type'),
'summary' => gv($params, 'summary'),
'description' => gv($params, 'description')
];
if (! $book_id) {
$formatted['uuid'] = Str::uuid();
}
$formatted['options'] = [];
return $formatted;
}
/**
* Update given book.
*
* @param Book $book
* @param array $params
*
* @return Book
*/
public function update(Book $book, $params)
{
return $book->forceFill($this->formatParams($params, $book->id))->save();
}
/**
* Find book & check it can be deleted or not.
*
* @param string $uuid
* @return Book
*/
public function deletable($uuid)
{
$book = $this->findByUuidOrFail($uuid);
if ($book->BookPosts->count()) {
throw ValidationException::withMessages(['message' => trans('library.book_associated_with_post') ]);
}
return $book;
}
/**
* Delete book.
*
* @param integer $id
* @return bool|null
*/
public function delete(Book $book)
{
return $book->delete();
}
/**
* Delete multiple books.
*
* @param array $ids
* @return bool|null
*/
public function deleteMultiple($ids)
{
return $this->book->whereIn('id', $ids)->delete();
}
/**
* Get last book number.
*
* @return integer
*/
public function getLastBookNumber()
{
$last_book = $this->book_post_detail->max('number');
return $last_book ? $last_book + 1 : 1;
}
/**
* Post books.
*
* @param Book $book
* @param Array $params
* @return Book
*/
public function post(Book $book, $params)
{
$date_of_addition = toDate(gv($params, 'date_of_addition'));
$quantity = gv($params, 'quantity', 0);
$details = gv($params, 'details');
if (! $details) {
throw ValidationException::withMessages(['message' => trans('library.no_book_post_found')]);
}
if ($quantity != count($details)) {
throw ValidationException::withMessages(['quantity' => trans('library.book_quantity_mismatch_with_detail')]);
}
if ($this->book_post->filterByBookId($book->id)->where('date_of_addition', '>', $date_of_addition)->count()) {
throw ValidationException::withMessages(['date_of_addition' => trans('library.book_post_found_on_previous_date')]);
}
$book_condition_ids = $this->book_condition->listId();
$book_numbers = array();
foreach ($details as $index => $detail) {
$book_number = gv($detail, 'number');
if (! is_numeric($book_number)) {
throw ValidationException::withMessages([$index.'_number' => trans('validation.integer', ['attribute' => $book_number])]);
}
if ($book_number < 1) {
throw ValidationException::withMessages([$index.'_number' => trans('validation.min.numeric', ['attribute' => $book_number, 'min' => 1])]);
}
$book_condition_id = gv($detail, 'book_condition_id');
if ($book_condition_id && ! in_array($book_condition_id, $book_condition_ids)) {
throw ValidationException::withMessages([$index.'_condition' => trans('library.could_not_find_book_condition')]);
}
$book_numbers[] = $book_number;
}
if (count($book_numbers) > count(array_unique($book_numbers))) {
throw ValidationException::withMessages(['message' => trans('library.duplicate_book_number_found')]);
}
$existing_books = $this->book_post_detail->whereIn('number', $book_numbers)->get();
foreach ($details as $index => $detail) {
$existing_book = $existing_books->firstWhere('number', gv($detail, 'number'));
if ($existing_book) {
throw ValidationException::withMessages([$index.'_number' => trans('library.book_number_exists', ['number' => $existing_book->number]) ]);
}
}
$book_post = $this->book_post->forceCreate([
'book_id' => $book->id,
'date_of_addition' => toDate($date_of_addition),
'quantity' => $quantity,
'remarks' => gv($params, 'remarks'),
'options' => array()
]);
foreach ($details as $detail) {
$this->book_post_detail->forceCreate([
'book_post_id' => $book_post->id,
'number' => gv($detail, 'number'),
'location' => gv($detail, 'location'),
'book_condition_id' => gv($detail, 'book_condition_id'),
'options' => array()
]);
}
return $book;
}
/**
* Update book detail.
*
* @param Book $book
* @param Integer $id
* @param Array $params
* @return Book
*/
public function updateBookDetail(Book $book, $id, $params)
{
$book_post_detail = $this->book_post_detail->whereHas('bookPost', function ($q) use ($book) {
$q->where('book_id', $book->id);
})->filterById($id)->first();
if (! $book_post_detail) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book')]);
}
$number = gv($params, 'number');
$location = gv($params, 'location');
$book_condition_id = gv($params, 'book_condition_id');
$remarks = gv($params, 'remarks');
$is_not_available = gbv($params, 'is_not_available');
if ($this->book_post_detail->where('id', '!=', $id)->filterByNumber($number)->count()) {
throw ValidationException::withMessages(['number' => trans('library.book_number_exists', ['number' => $number])]);
}
if ($book_condition_id) {
$book_condition = $this->book_condition->findOrFail($book_condition_id);
}
$book_post_detail->number = $number;
$book_post_detail->location = $location;
$book_post_detail->book_condition_id = $book_condition_id;
$book_post_detail->remarks = $remarks;
$book_post_detail->is_not_available = $is_not_available;
$book_post_detail->save();
return $book;
}
/**
* Delete book post.
*
* @param Book $book
* @param integer $id
* @return bool|null
*/
public function deleteBookPost(Book $book, $id)
{
$book_post = $this->book_post->filterById($id)->filterByBookId($book->id)->first();
if (! $book_post) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book_post')]);
}
$book_post_detail_ids = $book_post->BookPostDetails->pluck('id')->all();
if ($this->book_log_detail->whereIn('book_post_detail_id', $book_post_detail_ids)->count()) {
throw ValidationException::withMessages(['message' => trans('library.could_not_delete_book_if_book_log_exists')]);
}
$book_post->delete();
}
/**
* Delete book post detail.
*
* @param Book $book
* @param integer $id
* @return bool|null
*/
public function deleteBookPostDetail(Book $book, $id)
{
$book_post_detail = $this->book_post_detail->filterById($id)->whereHas('bookPost',function($q) use($book) {
$q->where('book_id',$book->id);
})->first();
if (! $book_post_detail) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book')]);
}
if ($this->book_log_detail->where('book_post_detail_id', $id)->count()) {
throw ValidationException::withMessages(['message' => trans('library.could_not_delete_book_if_book_log_exists')]);
}
$book_post_detail->delete();
}
/**
* Get book post detail
*
* @param integer $number
* @param date $date
* @return null
*/
public function getBookPostDetail($number, $date)
{
$date = toDate($date);
$book_post_detail = $this->book_post_detail->with('bookPost', 'bookLogDetails', 'bookLogDetails.bookLog')->filterByAvailability()->filterByNumber($number)->first();
if (! $book_post_detail) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book')]);
}
$date_of_addition = toDate($book_post_detail->bookPost->date_of_addition);
if ($date_of_addition > $date) {
throw ValidationException::withMessages(['message' => trans('library.book_added_after_given_date', ['number' => $number, 'date_of_addition' => showDate($date_of_addition), 'date_of_issue' => showDate($date)])]);
}
$last_issued = $book_post_detail->bookLogDetails->sortByDesc('id')->first();
if ($last_issued) {
if ($last_issued->date_of_return && toDate($last_issued->date_of_return) > $date) {
throw ValidationException::withMessages(['message' => trans('library.book_last_returned_after_given_date', ['number' => $number, 'date_of_issue' => showDate($last_issued->date_of_return)])]);
}
if (! $last_issued->date_of_return) {
throw ValidationException::withMessages(['message' => trans('library.book_not_returned', ['number' => $number])]);
}
// $last_issued_date = toDate($last_issued->bookLog->date_of_issue);
// if ($last_issued_date > $date) {
// throw ValidationException::withMessages(['message' => trans('library.book_last_issued_after_given_date', ['number' => $number, 'date_of_issue' => showDate($last_issued_date)])]);
// }
}
return $book_post_detail;
}
/**
* Search book by number.
*
* @param Array $params
* @return BookPostDetail
*/
public function searchByNumber($params = array())
{
$number = gv($params, 'number');
$date = toDate(gv($params, 'date'));
if (! $number) {
throw ValidationException::withMessages(['message' => trans('library.could_not_find_book')]);
}
$book_post_detail = $this->getBookPostDetail($number, $date);
return $book_post_detail->load('bookPost.book', 'bookPost.book.bookAuthor', 'bookPost.book.bookLanguage', 'bookPost.book.bookTopic', 'bookPost.book.bookPublisher', 'bookCondition');
}
}