Bug 14201: DBRev 3.21.00.030
[koha.git] / C4 / CourseReserves.pm
blob7e160d0494667debc41f7d9da515b9e771f5e01f
1 package C4::CourseReserves;
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
18 use Modern::Perl;
20 use C4::Context;
21 use C4::Items qw(GetItem ModItem);
22 use C4::Biblio qw(GetBiblioFromItemNumber);
23 use C4::Circulation qw(GetOpenIssue);
25 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG @FIELDS);
27 BEGIN {
28 require Exporter;
29 @ISA = qw(Exporter);
30 @EXPORT_OK = qw(
31 &GetCourse
32 &ModCourse
33 &GetCourses
34 &DelCourse
36 &GetCourseInstructors
37 &ModCourseInstructors
39 &GetCourseItem
40 &ModCourseItem
42 &GetCourseReserve
43 &ModCourseReserve
44 &GetCourseReserves
45 &DelCourseReserve
47 &SearchCourses
49 &GetItemCourseReservesInfo
51 %EXPORT_TAGS = ( 'all' => \@EXPORT_OK );
53 $DEBUG = 0;
54 @FIELDS = ( 'itype', 'ccode', 'holdingbranch', 'location' );
57 =head1 NAME
59 C4::CourseReserves - Koha course reserves module
61 =head1 SYNOPSIS
63 use C4::CourseReserves;
65 =head1 DESCRIPTION
67 This module deals with course reserves.
69 =head1 FUNCTIONS
71 =head2 GetCourse
73 $course = GetCourse( $course_id );
75 =cut
77 sub GetCourse {
78 my ($course_id) = @_;
79 warn whoami() . "( $course_id )" if $DEBUG;
81 my $query = "SELECT * FROM courses WHERE course_id = ?";
82 my $dbh = C4::Context->dbh;
83 my $sth = $dbh->prepare($query);
84 $sth->execute($course_id);
86 my $course = $sth->fetchrow_hashref();
88 $query = "
89 SELECT b.* FROM course_instructors ci
90 LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber )
91 WHERE course_id = ?
93 $sth = $dbh->prepare($query);
94 $sth->execute($course_id);
95 $course->{'instructors'} = $sth->fetchall_arrayref( {} );
97 return $course;
100 =head2 ModCourse
102 ModCourse( [ course_id => $id ] [, course_name => $course_name ] [etc...] );
104 =cut
106 sub ModCourse {
107 my (%params) = @_;
108 warn identify_myself(%params) if $DEBUG;
110 my $dbh = C4::Context->dbh;
112 my $course_id;
113 if ( defined $params{'course_id'} ) {
114 $course_id = $params{'course_id'};
115 delete $params{'course_id'};
118 my @query_keys;
119 my @query_values;
121 my $query;
123 $query .= ($course_id) ? ' UPDATE ' : ' INSERT ';
124 $query .= ' courses SET ';
126 foreach my $key ( keys %params ) {
127 push( @query_keys, "$key=?" );
128 push( @query_values, $params{$key} );
130 $query .= join( ',', @query_keys );
132 if ($course_id) {
133 $query .= " WHERE course_id = ?";
134 push( @query_values, $course_id );
137 $dbh->do( $query, undef, @query_values );
139 $course_id = $course_id
140 || $dbh->last_insert_id( undef, undef, 'courses', 'course_id' );
142 EnableOrDisableCourseItems(
143 course_id => $course_id,
144 enabled => $params{'enabled'}
147 return $course_id;
150 =head2 GetCourses
152 @courses = GetCourses( [ fieldname => $value ] [, fieldname2 => $value2 ] [etc...] );
154 =cut
156 sub GetCourses {
157 my (%params) = @_;
158 warn identify_myself(%params) if $DEBUG;
160 my @query_keys;
161 my @query_values;
163 my $query = "
164 SELECT courses.*
165 FROM courses
166 LEFT JOIN course_reserves ON course_reserves.course_id = courses.course_id
167 LEFT JOIN course_items ON course_items.ci_id = course_reserves.ci_id
170 if ( keys %params ) {
172 $query .= " WHERE ";
174 foreach my $key ( keys %params ) {
175 push( @query_keys, " $key LIKE ? " );
176 push( @query_values, $params{$key} );
179 $query .= join( ' AND ', @query_keys );
182 $query .= " GROUP BY courses.course_id ";
184 my $dbh = C4::Context->dbh;
185 my $sth = $dbh->prepare($query);
186 $sth->execute(@query_values);
188 my $courses = $sth->fetchall_arrayref( {} );
190 foreach my $c (@$courses) {
191 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
194 return $courses;
197 =head2 DelCourse
199 DelCourse( $course_id );
201 =cut
203 sub DelCourse {
204 my ($course_id) = @_;
206 my $course_reserves = GetCourseReserves( course_id => $course_id );
208 foreach my $res (@$course_reserves) {
209 DelCourseReserve( cr_id => $res->{'cr_id'} );
212 my $query = "
213 DELETE FROM course_instructors
214 WHERE course_id = ?
216 C4::Context->dbh->do( $query, undef, $course_id );
218 $query = "
219 DELETE FROM courses
220 WHERE course_id = ?
222 C4::Context->dbh->do( $query, undef, $course_id );
225 =head2 EnableOrDisableCourseItems
227 EnableOrDisableCourseItems( course_id => $course_id, enabled => $enabled );
229 For each item on reserve for this course,
230 if the course item has no active course reserves,
231 swap the fields for the item to make it 'normal'
232 again.
234 enabled => 'yes' to enable course items
235 enabled => 'no' to disable course items
237 =cut
239 sub EnableOrDisableCourseItems {
240 my (%params) = @_;
241 warn identify_myself(%params) if $DEBUG;
243 my $course_id = $params{'course_id'};
244 my $enabled = $params{'enabled'} || 0;
246 my $lookfor = ( $enabled eq 'yes' ) ? 'no' : 'yes';
248 return unless ( $course_id && $enabled );
249 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
251 my $course_reserves = GetCourseReserves( course_id => $course_id );
253 if ( $enabled eq 'yes' ) {
254 foreach my $course_reserve (@$course_reserves) {
255 if (CountCourseReservesForItem(
256 ci_id => $course_reserve->{'ci_id'},
257 enabled => 'yes'
260 EnableOrDisableCourseItem(
261 ci_id => $course_reserve->{'ci_id'},
262 enabled => 'yes',
267 if ( $enabled eq 'no' ) {
268 foreach my $course_reserve (@$course_reserves) {
269 unless (
270 CountCourseReservesForItem(
271 ci_id => $course_reserve->{'ci_id'},
272 enabled => 'yes'
275 EnableOrDisableCourseItem(
276 ci_id => $course_reserve->{'ci_id'},
277 enabled => 'no',
284 =head2 EnableOrDisableCourseItem
286 EnableOrDisableCourseItem( ci_id => $ci_id, enabled => $enabled );
288 enabled => 'yes' to enable course items
289 enabled => 'no' to disable course items
291 =cut
293 sub EnableOrDisableCourseItem {
294 my (%params) = @_;
295 warn identify_myself(%params) if $DEBUG;
297 my $ci_id = $params{'ci_id'};
298 my $enabled = $params{'enabled'};
300 return unless ( $ci_id && $enabled );
301 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
303 my $course_item = GetCourseItem( ci_id => $ci_id );
305 ## We don't want to 'enable' an already enabled item,
306 ## or disable and already disabled item,
307 ## as that would cause the fields to swap
308 if ( $course_item->{'enabled'} ne $enabled ) {
309 _SwapAllFields($ci_id);
311 my $query = "
312 UPDATE course_items
313 SET enabled = ?
314 WHERE ci_id = ?
317 C4::Context->dbh->do( $query, undef, $enabled, $ci_id );
323 =head2 GetCourseInstructors
325 @$borrowers = GetCourseInstructors( $course_id );
327 =cut
329 sub GetCourseInstructors {
330 my ($course_id) = @_;
331 warn "C4::CourseReserves::GetCourseInstructors( $course_id )"
332 if $DEBUG;
334 my $query = "
335 SELECT * FROM borrowers
336 RIGHT JOIN course_instructors ON ( course_instructors.borrowernumber = borrowers.borrowernumber )
337 WHERE course_instructors.course_id = ?
340 my $dbh = C4::Context->dbh;
341 my $sth = $dbh->prepare($query);
342 $sth->execute($course_id);
344 return $sth->fetchall_arrayref( {} );
347 =head2 ModCourseInstructors
349 ModCourseInstructors( mode => $mode, course_id => $course_id, [ cardnumbers => $cardnumbers ] OR [ borrowernumbers => $borrowernumbers );
351 $mode can be 'replace', 'add', or 'delete'
353 $cardnumbers and $borrowernumbers are both references to arrays
355 Use either cardnumbers or borrowernumber, but not both.
357 =cut
359 sub ModCourseInstructors {
360 my (%params) = @_;
361 warn identify_myself(%params) if $DEBUG;
363 my $course_id = $params{'course_id'};
364 my $mode = $params{'mode'};
365 my $cardnumbers = $params{'cardnumbers'};
366 my $borrowernumbers = $params{'borrowernumbers'};
368 return unless ($course_id);
369 return
370 unless ( $mode eq 'replace'
371 || $mode eq 'add'
372 || $mode eq 'delete' );
373 return unless ( $cardnumbers || $borrowernumbers );
374 return if ( $cardnumbers && $borrowernumbers );
376 my ( @cardnumbers, @borrowernumbers );
377 @cardnumbers = @$cardnumbers if ( ref($cardnumbers) eq 'ARRAY' );
378 @borrowernumbers = @$borrowernumbers
379 if ( ref($borrowernumbers) eq 'ARRAY' );
381 my $field = (@cardnumbers) ? 'cardnumber' : 'borrowernumber';
382 my @fields = (@cardnumbers) ? @cardnumbers : @borrowernumbers;
383 my $placeholders = join( ',', ('?') x scalar @fields );
385 my $dbh = C4::Context->dbh;
387 $dbh->do( "DELETE FROM course_instructors WHERE course_id = ?", undef, $course_id )
388 if ( $mode eq 'replace' );
390 my $query;
392 if ( $mode eq 'add' || $mode eq 'replace' ) {
393 $query = "
394 INSERT INTO course_instructors ( course_id, borrowernumber )
395 SELECT ?, borrowernumber
396 FROM borrowers
397 WHERE $field IN ( $placeholders )
399 } else {
400 $query = "
401 DELETE FROM course_instructors
402 WHERE course_id = ?
403 AND borrowernumber IN (
404 SELECT borrowernumber FROM borrowers WHERE $field IN ( $placeholders )
409 my $sth = $dbh->prepare($query);
411 $sth->execute( $course_id, @fields ) if (@fields);
414 =head2 GetCourseItem {
416 $course_item = GetCourseItem( itemnumber => $itemnumber [, ci_id => $ci_id );
418 =cut
420 sub GetCourseItem {
421 my (%params) = @_;
422 warn identify_myself(%params) if $DEBUG;
424 my $ci_id = $params{'ci_id'};
425 my $itemnumber = $params{'itemnumber'};
427 return unless ( $itemnumber || $ci_id );
429 my $field = ($itemnumber) ? 'itemnumber' : 'ci_id';
430 my $value = ($itemnumber) ? $itemnumber : $ci_id;
432 my $query = "SELECT * FROM course_items WHERE $field = ?";
433 my $dbh = C4::Context->dbh;
434 my $sth = $dbh->prepare($query);
435 $sth->execute($value);
437 my $course_item = $sth->fetchrow_hashref();
439 if ($course_item) {
440 $query = "SELECT * FROM course_reserves WHERE ci_id = ?";
441 $sth = $dbh->prepare($query);
442 $sth->execute( $course_item->{'ci_id'} );
443 my $course_reserves = $sth->fetchall_arrayref( {} );
445 $course_item->{'course_reserves'} = $course_reserves
446 if ($course_reserves);
448 return $course_item;
451 =head2 ModCourseItem {
453 ModCourseItem( %params );
455 Creates or modifies an existing course item.
457 =cut
459 sub ModCourseItem {
460 my (%params) = @_;
461 warn identify_myself(%params) if $DEBUG;
463 my $itemnumber = $params{'itemnumber'};
464 my $itype = $params{'itype'};
465 my $ccode = $params{'ccode'};
466 my $holdingbranch = $params{'holdingbranch'};
467 my $location = $params{'location'};
469 return unless ($itemnumber);
471 my $course_item = GetCourseItem( itemnumber => $itemnumber );
473 my $ci_id;
475 if ($course_item) {
476 $ci_id = $course_item->{'ci_id'};
478 _UpdateCourseItem(
479 ci_id => $ci_id,
480 course_item => $course_item,
481 %params
483 } else {
484 $ci_id = _AddCourseItem(%params);
487 return $ci_id;
491 =head2 _AddCourseItem
493 my $ci_id = _AddCourseItem( %params );
495 =cut
497 sub _AddCourseItem {
498 my (%params) = @_;
499 warn identify_myself(%params) if $DEBUG;
501 my ( @fields, @values );
503 push( @fields, 'itemnumber = ?' );
504 push( @values, $params{'itemnumber'} );
506 foreach (@FIELDS) {
507 if ( $params{$_} ) {
508 push( @fields, "$_ = ?" );
509 push( @values, $params{$_} );
513 my $query = "INSERT INTO course_items SET " . join( ',', @fields );
514 my $dbh = C4::Context->dbh;
515 $dbh->do( $query, undef, @values );
517 my $ci_id = $dbh->last_insert_id( undef, undef, 'course_items', 'ci_id' );
519 return $ci_id;
522 =head2 _UpdateCourseItem
524 _UpdateCourseItem( %params );
526 =cut
528 sub _UpdateCourseItem {
529 my (%params) = @_;
530 warn identify_myself(%params) if $DEBUG;
532 my $ci_id = $params{'ci_id'};
533 my $course_item = $params{'course_item'};
534 my $itype = $params{'itype'};
535 my $ccode = $params{'ccode'};
536 my $holdingbranch = $params{'holdingbranch'};
537 my $location = $params{'location'};
539 return unless ( $ci_id || $course_item );
541 $course_item = GetCourseItem( ci_id => $ci_id )
542 unless ($course_item);
543 $ci_id = $course_item->{'ci_id'} unless ($ci_id);
545 ## Revert fields that had an 'original' value, but now don't
546 ## Update the item fields to the stored values from course_items
547 ## and then set those fields in course_items to NULL
548 my @fields_to_revert;
549 foreach (@FIELDS) {
550 if ( !$params{$_} && $course_item->{$_} ) {
551 push( @fields_to_revert, $_ );
554 _RevertFields(
555 ci_id => $ci_id,
556 fields => \@fields_to_revert,
557 course_item => $course_item
558 ) if (@fields_to_revert);
560 ## Update fields that still have an original value, but it has changed
561 ## This necessitates only changing the current item values, as we still
562 ## have the original values stored in course_items
563 my %mod_params;
564 foreach (@FIELDS) {
565 if ( $params{$_}
566 && $course_item->{$_}
567 && $params{$_} ne $course_item->{$_} ) {
568 $mod_params{$_} = $params{$_};
571 ModItem( \%mod_params, undef, $course_item->{'itemnumber'} ) if %mod_params;
573 ## Update fields that didn't have an original value, but now do
574 ## We must save the original value in course_items, and also
575 ## update the item fields to the new value
576 my $item = GetItem( $course_item->{'itemnumber'} );
577 my %mod_params_new;
578 my %mod_params_old;
579 foreach (@FIELDS) {
580 if ( $params{$_} && !$course_item->{$_} ) {
581 $mod_params_new{$_} = $params{$_};
582 $mod_params_old{$_} = $item->{$_};
585 _ModStoredFields( 'ci_id' => $params{'ci_id'}, %mod_params_old );
586 ModItem( \%mod_params_new, undef, $course_item->{'itemnumber'} ) if %mod_params_new;
590 =head2 _ModStoredFields
592 _ModStoredFields( %params );
594 Updates the values for the 'original' fields in course_items
595 for a given ci_id
597 =cut
599 sub _ModStoredFields {
600 my (%params) = @_;
601 warn identify_myself(%params) if $DEBUG;
603 return unless ( $params{'ci_id'} );
605 my ( @fields_to_update, @values_to_update );
607 foreach (@FIELDS) {
608 if ( $params{$_} ) {
609 push( @fields_to_update, $_ );
610 push( @values_to_update, $params{$_} );
614 my $query = "UPDATE course_items SET " . join( ',', map { "$_=?" } @fields_to_update ) . " WHERE ci_id = ?";
616 C4::Context->dbh->do( $query, undef, @values_to_update, $params{'ci_id'} )
617 if (@values_to_update);
621 =head2 _RevertFields
623 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
625 =cut
627 sub _RevertFields {
628 my (%params) = @_;
629 warn identify_myself(%params) if $DEBUG;
631 my $ci_id = $params{'ci_id'};
632 my $course_item = $params{'course_item'};
633 my $fields = $params{'fields'};
634 my @fields = @$fields;
636 return unless ($ci_id);
638 $course_item = GetCourseItem( ci_id => $params{'ci_id'} )
639 unless ($course_item);
641 my $mod_item_params;
642 my @fields_to_null;
643 foreach my $field (@fields) {
644 foreach (@FIELDS) {
645 if ( $field eq $_ && $course_item->{$_} ) {
646 $mod_item_params->{$_} = $course_item->{$_};
647 push( @fields_to_null, $_ );
651 ModItem( $mod_item_params, undef, $course_item->{'itemnumber'} ) if $mod_item_params && %$mod_item_params;
653 my $query = "UPDATE course_items SET " . join( ',', map { "$_=NULL" } @fields_to_null ) . " WHERE ci_id = ?";
655 C4::Context->dbh->do( $query, undef, $ci_id ) if (@fields_to_null);
658 =head2 _SwapAllFields
660 _SwapAllFields( $ci_id );
662 =cut
664 sub _SwapAllFields {
665 my ($ci_id) = @_;
666 warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG;
668 my $course_item = GetCourseItem( ci_id => $ci_id );
669 my $item = GetItem( $course_item->{'itemnumber'} );
671 my %course_item_fields;
672 my %item_fields;
673 foreach (@FIELDS) {
674 if ( $course_item->{$_} ) {
675 $course_item_fields{$_} = $course_item->{$_};
676 $item_fields{$_} = $item->{$_};
680 ModItem( \%course_item_fields, undef, $course_item->{'itemnumber'} ) if %course_item_fields;
681 _ModStoredFields( %item_fields, ci_id => $ci_id );
684 =head2 GetCourseItems {
686 $course_items = GetCourseItems(
687 [course_id => $course_id]
688 [, itemnumber => $itemnumber ]
691 =cut
693 sub GetCourseItems {
694 my (%params) = @_;
695 warn identify_myself(%params) if $DEBUG;
697 my $course_id = $params{'course_id'};
698 my $itemnumber = $params{'itemnumber'};
700 return unless ($course_id);
702 my @query_keys;
703 my @query_values;
705 my $query = "SELECT * FROM course_items";
707 if ( keys %params ) {
709 $query .= " WHERE ";
711 foreach my $key ( keys %params ) {
712 push( @query_keys, " $key LIKE ? " );
713 push( @query_values, $params{$key} );
716 $query .= join( ' AND ', @query_keys );
719 my $dbh = C4::Context->dbh;
720 my $sth = $dbh->prepare($query);
721 $sth->execute(@query_values);
723 return $sth->fetchall_arrayref( {} );
726 =head2 DelCourseItem {
728 DelCourseItem( ci_id => $cr_id );
730 =cut
732 sub DelCourseItem {
733 my (%params) = @_;
734 warn identify_myself(%params) if $DEBUG;
736 my $ci_id = $params{'ci_id'};
738 return unless ($ci_id);
740 _RevertFields( ci_id => $ci_id, fields => \@FIELDS );
742 my $query = "
743 DELETE FROM course_items
744 WHERE ci_id = ?
746 C4::Context->dbh->do( $query, undef, $ci_id );
749 =head2 GetCourseReserve {
751 $course_item = GetCourseReserve( %params );
753 =cut
755 sub GetCourseReserve {
756 my (%params) = @_;
757 warn identify_myself(%params) if $DEBUG;
759 my $cr_id = $params{'cr_id'};
760 my $course_id = $params{'course_id'};
761 my $ci_id = $params{'ci_id'};
763 return unless ( $cr_id || ( $course_id && $ci_id ) );
765 my $dbh = C4::Context->dbh;
766 my $sth;
768 if ($cr_id) {
769 my $query = "
770 SELECT * FROM course_reserves
771 WHERE cr_id = ?
773 $sth = $dbh->prepare($query);
774 $sth->execute($cr_id);
775 } else {
776 my $query = "
777 SELECT * FROM course_reserves
778 WHERE course_id = ? AND ci_id = ?
780 $sth = $dbh->prepare($query);
781 $sth->execute( $course_id, $ci_id );
784 my $course_reserve = $sth->fetchrow_hashref();
785 return $course_reserve;
788 =head2 ModCourseReserve
790 $id = ModCourseReserve( %params );
792 =cut
794 sub ModCourseReserve {
795 my (%params) = @_;
796 warn identify_myself(%params) if $DEBUG;
798 my $course_id = $params{'course_id'};
799 my $ci_id = $params{'ci_id'};
800 my $staff_note = $params{'staff_note'};
801 my $public_note = $params{'public_note'};
803 return unless ( $course_id && $ci_id );
805 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
806 my $cr_id;
808 my $dbh = C4::Context->dbh;
810 if ($course_reserve) {
811 $cr_id = $course_reserve->{'cr_id'};
813 my $query = "
814 UPDATE course_reserves
815 SET staff_note = ?, public_note = ?
816 WHERE cr_id = ?
818 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
819 } else {
820 my $query = "
821 INSERT INTO course_reserves SET
822 course_id = ?,
823 ci_id = ?,
824 staff_note = ?,
825 public_note = ?
827 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
828 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
831 my $course = GetCourse($course_id);
832 EnableOrDisableCourseItem(
833 ci_id => $params{'ci_id'},
834 enabled => $course->{'enabled'}
837 return $cr_id;
840 =head2 GetCourseReserves {
842 $course_reserves = GetCourseReserves( %params );
844 Required:
845 course_id OR ci_id
846 Optional:
847 include_items => 1,
848 include_count => 1,
849 include_courses => 1,
851 =cut
853 sub GetCourseReserves {
854 my (%params) = @_;
855 warn identify_myself(%params) if $DEBUG;
857 my $course_id = $params{'course_id'};
858 my $ci_id = $params{'ci_id'};
859 my $include_items = $params{'include_items'};
860 my $include_count = $params{'include_count'};
861 my $include_courses = $params{'include_courses'};
863 return unless ( $course_id || $ci_id );
865 my $field = ($course_id) ? 'course_id' : 'ci_id';
866 my $value = ($course_id) ? $course_id : $ci_id;
868 my $query = "
869 SELECT cr.*, ci.itemnumber
870 FROM course_reserves cr, course_items ci
871 WHERE cr.$field = ?
872 AND cr.ci_id = ci.ci_id
874 my $dbh = C4::Context->dbh;
875 my $sth = $dbh->prepare($query);
876 $sth->execute($value);
878 my $course_reserves = $sth->fetchall_arrayref( {} );
880 if ($include_items) {
881 foreach my $cr (@$course_reserves) {
882 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
883 $cr->{'item'} = GetBiblioFromItemNumber( $cr->{'itemnumber'} );
884 $cr->{'issue'} = GetOpenIssue( $cr->{'itemnumber'} );
888 if ($include_count) {
889 foreach my $cr (@$course_reserves) {
890 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
894 if ($include_courses) {
895 foreach my $cr (@$course_reserves) {
896 $cr->{'courses'} = GetCourses( itemnumber => $cr->{'itemnumber'} );
900 return $course_reserves;
903 =head2 DelCourseReserve {
905 DelCourseReserve( cr_id => $cr_id );
907 =cut
909 sub DelCourseReserve {
910 my (%params) = @_;
911 warn identify_myself(%params) if $DEBUG;
913 my $cr_id = $params{'cr_id'};
915 return unless ($cr_id);
917 my $dbh = C4::Context->dbh;
919 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
921 my $query = "
922 DELETE FROM course_reserves
923 WHERE cr_id = ?
925 $dbh->do( $query, undef, $cr_id );
927 ## If there are no other course reserves for this item
928 ## delete the course_item as well
929 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
930 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
935 =head2 GetReservesInfo
937 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
939 For a given item, returns an arrayref of reserves hashrefs,
940 with a course hashref under the key 'course'
942 =cut
944 sub GetItemCourseReservesInfo {
945 my (%params) = @_;
946 warn identify_myself(%params) if $DEBUG;
948 my $itemnumber = $params{'itemnumber'};
950 return unless ($itemnumber);
952 my $course_item = GetCourseItem( itemnumber => $itemnumber );
954 return unless ( keys %$course_item );
956 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
958 foreach my $cr (@$course_reserves) {
959 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
962 return $course_reserves;
965 =head2 CountCourseReservesForItem
967 $bool = CountCourseReservesForItem( %params );
969 ci_id - course_item id
971 itemnumber - course_item itemnumber
973 enabled = 'yes' or 'no'
974 Optional, if not supplied, counts reserves
975 for both enabled and disabled courses
977 =cut
979 sub CountCourseReservesForItem {
980 my (%params) = @_;
981 warn identify_myself(%params) if $DEBUG;
983 my $ci_id = $params{'ci_id'};
984 my $itemnumber = $params{'itemnumber'};
985 my $enabled = $params{'enabled'};
987 return unless ( $ci_id || $itemnumber );
989 my $course_item = GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber );
991 my @params = ( $course_item->{'ci_id'} );
992 push( @params, $enabled ) if ($enabled);
994 my $query = "
995 SELECT COUNT(*) AS count
996 FROM course_reserves cr
997 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
998 WHERE ci_id = ?
1000 $query .= "AND c.enabled = ?" if ($enabled);
1002 my $dbh = C4::Context->dbh;
1003 my $sth = $dbh->prepare($query);
1004 $sth->execute(@params);
1006 my $row = $sth->fetchrow_hashref();
1008 return $row->{'count'};
1011 =head2 SearchCourses
1013 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
1015 =cut
1017 sub SearchCourses {
1018 my (%params) = @_;
1019 warn identify_myself(%params) if $DEBUG;
1021 my $term = $params{'term'};
1023 my $enabled = $params{'enabled'} || '%';
1025 my @params;
1026 my $query = "SELECT c.* FROM courses c";
1028 $query .= "
1029 LEFT JOIN course_instructors ci
1030 ON ( c.course_id = ci.course_id )
1031 LEFT JOIN borrowers b
1032 ON ( ci.borrowernumber = b.borrowernumber )
1033 LEFT JOIN authorised_values av
1034 ON ( c.department = av.authorised_value )
1035 WHERE
1036 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
1039 department LIKE ? OR
1040 course_number LIKE ? OR
1041 section LIKE ? OR
1042 course_name LIKE ? OR
1043 term LIKE ? OR
1044 public_note LIKE ? OR
1045 CONCAT(surname,' ',firstname) LIKE ? OR
1046 CONCAT(firstname,' ',surname) LIKE ? OR
1047 lib LIKE ? OR
1048 lib_opac LIKE ?
1051 c.enabled LIKE ?
1052 GROUP BY c.course_id
1055 $term //= '';
1056 $term = "%$term%";
1057 @params = ($term) x 10;
1059 $query .= " ORDER BY department, course_number, section, term, course_name ";
1061 my $dbh = C4::Context->dbh;
1062 my $sth = $dbh->prepare($query);
1064 $sth->execute( @params, $enabled );
1066 my $courses = $sth->fetchall_arrayref( {} );
1068 foreach my $c (@$courses) {
1069 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1072 return $courses;
1075 sub whoami { ( caller(1) )[3] }
1076 sub whowasi { ( caller(2) )[3] }
1078 sub stringify_params {
1079 my (%params) = @_;
1081 my $string = "\n";
1083 foreach my $key ( keys %params ) {
1084 $string .= " $key => " . $params{$key} . "\n";
1087 return "( $string )";
1090 sub identify_myself {
1091 my (%params) = @_;
1093 return whowasi() . stringify_params(%params);
1098 =head1 AUTHOR
1100 Kyle M Hall <kyle@bywatersolutions.com>
1102 =cut