Bug 23194: Allow HTML in item public notes to be processed on OPAC details
[koha.git] / C4 / CourseReserves.pm
blob39630b63c9dfeee5136ce2ddfa19a776c5f96a95
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 List::MoreUtils qw(any);
22 use C4::Context;
23 use C4::Items qw(ModItem);
24 use C4::Circulation qw(GetOpenIssue);
26 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG @FIELDS);
28 BEGIN {
29 require Exporter;
30 @ISA = qw(Exporter);
31 @EXPORT_OK = qw(
32 &GetCourse
33 &ModCourse
34 &GetCourses
35 &DelCourse
37 &GetCourseInstructors
38 &ModCourseInstructors
40 &GetCourseItem
41 &ModCourseItem
43 &GetCourseReserve
44 &ModCourseReserve
45 &GetCourseReserves
46 &DelCourseReserve
48 &SearchCourses
50 &GetItemCourseReservesInfo
52 %EXPORT_TAGS = ( 'all' => \@EXPORT_OK );
54 $DEBUG = 0;
55 @FIELDS = ( 'itype', 'ccode', 'holdingbranch', 'location' );
58 =head1 NAME
60 C4::CourseReserves - Koha course reserves module
62 =head1 SYNOPSIS
64 use C4::CourseReserves;
66 =head1 DESCRIPTION
68 This module deals with course reserves.
70 =head1 FUNCTIONS
72 =head2 GetCourse
74 $course = GetCourse( $course_id );
76 =cut
78 sub GetCourse {
79 my ($course_id) = @_;
80 warn whoami() . "( $course_id )" if $DEBUG;
82 my $query = "SELECT * FROM courses WHERE course_id = ?";
83 my $dbh = C4::Context->dbh;
84 my $sth = $dbh->prepare($query);
85 $sth->execute($course_id);
87 my $course = $sth->fetchrow_hashref();
89 $query = "
90 SELECT b.* FROM course_instructors ci
91 LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber )
92 WHERE course_id = ?
94 $sth = $dbh->prepare($query);
95 $sth->execute($course_id);
96 $course->{'instructors'} = $sth->fetchall_arrayref( {} );
98 return $course;
101 =head2 ModCourse
103 ModCourse( [ course_id => $id ] [, course_name => $course_name ] [etc...] );
105 =cut
107 sub ModCourse {
108 my (%params) = @_;
109 warn identify_myself(%params) if $DEBUG;
111 my $dbh = C4::Context->dbh;
113 my $course_id;
114 if ( defined $params{'course_id'} ) {
115 $course_id = $params{'course_id'};
116 delete $params{'course_id'};
119 my @query_keys;
120 my @query_values;
122 my $query;
124 $query .= ($course_id) ? ' UPDATE ' : ' INSERT ';
125 $query .= ' courses SET ';
127 foreach my $key ( keys %params ) {
128 push( @query_keys, "$key=?" );
129 push( @query_values, $params{$key} );
131 $query .= join( ',', @query_keys );
133 if ($course_id) {
134 $query .= " WHERE course_id = ?";
135 push( @query_values, $course_id );
138 $dbh->do( $query, undef, @query_values );
140 $course_id = $course_id
141 || $dbh->last_insert_id( undef, undef, 'courses', 'course_id' );
143 EnableOrDisableCourseItems(
144 course_id => $course_id,
145 enabled => $params{'enabled'}
148 return $course_id;
151 =head2 GetCourses
153 @courses = GetCourses( [ fieldname => $value ] [, fieldname2 => $value2 ] [etc...] );
155 =cut
157 sub GetCourses {
158 my (%params) = @_;
159 warn identify_myself(%params) if $DEBUG;
161 my @query_keys;
162 my @query_values;
164 my $query = "
165 SELECT c.course_id, c.department, c.course_number, c.section, c.course_name, c.term, c.staff_note, c.public_note, c.students_count, c.enabled, c.timestamp
166 FROM courses c
167 LEFT JOIN course_reserves ON course_reserves.course_id = c.course_id
168 LEFT JOIN course_items ON course_items.ci_id = course_reserves.ci_id
171 if ( keys %params ) {
173 $query .= " WHERE ";
175 foreach my $key ( keys %params ) {
176 push( @query_keys, " $key LIKE ? " );
177 push( @query_values, $params{$key} );
180 $query .= join( ' AND ', @query_keys );
183 $query .= " GROUP BY c.course_id, c.department, c.course_number, c.section, c.course_name, c.term, c.staff_note, c.public_note, c.students_count, c.enabled, c.timestamp ";
185 my $dbh = C4::Context->dbh;
186 my $sth = $dbh->prepare($query);
187 $sth->execute(@query_values);
189 my $courses = $sth->fetchall_arrayref( {} );
191 foreach my $c (@$courses) {
192 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
195 return $courses;
198 =head2 DelCourse
200 DelCourse( $course_id );
202 =cut
204 sub DelCourse {
205 my ($course_id) = @_;
207 my $course_reserves = GetCourseReserves( course_id => $course_id );
209 foreach my $res (@$course_reserves) {
210 DelCourseReserve( cr_id => $res->{'cr_id'} );
213 my $query = "
214 DELETE FROM course_instructors
215 WHERE course_id = ?
217 C4::Context->dbh->do( $query, undef, $course_id );
219 $query = "
220 DELETE FROM courses
221 WHERE course_id = ?
223 C4::Context->dbh->do( $query, undef, $course_id );
226 =head2 EnableOrDisableCourseItems
228 EnableOrDisableCourseItems( course_id => $course_id, enabled => $enabled );
230 For each item on reserve for this course,
231 if the course item has no active course reserves,
232 swap the fields for the item to make it 'normal'
233 again.
235 enabled => 'yes' to enable course items
236 enabled => 'no' to disable course items
238 =cut
240 sub EnableOrDisableCourseItems {
241 my (%params) = @_;
242 warn identify_myself(%params) if $DEBUG;
244 my $course_id = $params{'course_id'};
245 my $enabled = $params{'enabled'} || 0;
247 my $lookfor = ( $enabled eq 'yes' ) ? 'no' : 'yes';
249 return unless ( $course_id && $enabled );
250 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
252 my $course_reserves = GetCourseReserves( course_id => $course_id );
254 if ( $enabled eq 'yes' ) {
255 foreach my $course_reserve (@$course_reserves) {
256 if (CountCourseReservesForItem(
257 ci_id => $course_reserve->{'ci_id'},
258 enabled => 'yes'
261 EnableOrDisableCourseItem(
262 ci_id => $course_reserve->{'ci_id'},
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'},
283 =head2 EnableOrDisableCourseItem
285 EnableOrDisableCourseItem( ci_id => $ci_id );
287 =cut
289 sub EnableOrDisableCourseItem {
290 my (%params) = @_;
291 warn identify_myself(%params) if $DEBUG;
293 my $ci_id = $params{'ci_id'};
295 return unless ( $ci_id );
297 my $course_item = GetCourseItem( ci_id => $ci_id );
299 my $info = GetItemCourseReservesInfo( itemnumber => $course_item->{itemnumber} );
301 my $enabled = any { $_->{course}->{enabled} eq 'yes' } @$info;
302 $enabled = $enabled ? 'yes' : 'no';
304 ## We don't want to 'enable' an already enabled item,
305 ## or disable and already disabled item,
306 ## as that would cause the fields to swap
307 if ( $course_item->{'enabled'} ne $enabled ) {
308 _SwapAllFields($ci_id);
310 my $query = "
311 UPDATE course_items
312 SET enabled = ?
313 WHERE ci_id = ?
316 C4::Context->dbh->do( $query, undef, $enabled, $ci_id );
322 =head2 GetCourseInstructors
324 @$borrowers = GetCourseInstructors( $course_id );
326 =cut
328 sub GetCourseInstructors {
329 my ($course_id) = @_;
330 warn "C4::CourseReserves::GetCourseInstructors( $course_id )"
331 if $DEBUG;
333 my $query = "
334 SELECT * FROM borrowers
335 RIGHT JOIN course_instructors ON ( course_instructors.borrowernumber = borrowers.borrowernumber )
336 WHERE course_instructors.course_id = ?
339 my $dbh = C4::Context->dbh;
340 my $sth = $dbh->prepare($query);
341 $sth->execute($course_id);
343 return $sth->fetchall_arrayref( {} );
346 =head2 ModCourseInstructors
348 ModCourseInstructors( mode => $mode, course_id => $course_id, [ cardnumbers => $cardnumbers ] OR [ borrowernumbers => $borrowernumbers );
350 $mode can be 'replace', 'add', or 'delete'
352 $cardnumbers and $borrowernumbers are both references to arrays
354 Use either cardnumbers or borrowernumber, but not both.
356 =cut
358 sub ModCourseInstructors {
359 my (%params) = @_;
360 warn identify_myself(%params) if $DEBUG;
362 my $course_id = $params{'course_id'};
363 my $mode = $params{'mode'};
364 my $cardnumbers = $params{'cardnumbers'};
365 my $borrowernumbers = $params{'borrowernumbers'};
367 return unless ($course_id);
368 return
369 unless ( $mode eq 'replace'
370 || $mode eq 'add'
371 || $mode eq 'delete' );
372 return unless ( $cardnumbers || $borrowernumbers );
373 return if ( $cardnumbers && $borrowernumbers );
375 my ( @cardnumbers, @borrowernumbers );
376 @cardnumbers = @$cardnumbers if ( ref($cardnumbers) eq 'ARRAY' );
377 @borrowernumbers = @$borrowernumbers
378 if ( ref($borrowernumbers) eq 'ARRAY' );
380 my $field = (@cardnumbers) ? 'cardnumber' : 'borrowernumber';
381 my @fields = (@cardnumbers) ? @cardnumbers : @borrowernumbers;
382 my $placeholders = join( ',', ('?') x scalar @fields );
384 my $dbh = C4::Context->dbh;
386 $dbh->do( "DELETE FROM course_instructors WHERE course_id = ?", undef, $course_id )
387 if ( $mode eq 'replace' );
389 my $query;
391 if ( $mode eq 'add' || $mode eq 'replace' ) {
392 $query = "
393 INSERT INTO course_instructors ( course_id, borrowernumber )
394 SELECT ?, borrowernumber
395 FROM borrowers
396 WHERE $field IN ( $placeholders )
398 } else {
399 $query = "
400 DELETE FROM course_instructors
401 WHERE course_id = ?
402 AND borrowernumber IN (
403 SELECT borrowernumber FROM borrowers WHERE $field IN ( $placeholders )
408 my $sth = $dbh->prepare($query);
410 $sth->execute( $course_id, @fields ) if (@fields);
413 =head2 GetCourseItem {
415 $course_item = GetCourseItem( itemnumber => $itemnumber [, ci_id => $ci_id );
417 =cut
419 sub GetCourseItem {
420 my (%params) = @_;
421 warn identify_myself(%params) if $DEBUG;
423 my $ci_id = $params{'ci_id'};
424 my $itemnumber = $params{'itemnumber'};
426 return unless ( $itemnumber || $ci_id );
428 my $field = ($itemnumber) ? 'itemnumber' : 'ci_id';
429 my $value = ($itemnumber) ? $itemnumber : $ci_id;
431 my $query = "SELECT * FROM course_items WHERE $field = ?";
432 my $dbh = C4::Context->dbh;
433 my $sth = $dbh->prepare($query);
434 $sth->execute($value);
436 my $course_item = $sth->fetchrow_hashref();
438 if ($course_item) {
439 $query = "SELECT * FROM course_reserves WHERE ci_id = ?";
440 $sth = $dbh->prepare($query);
441 $sth->execute( $course_item->{'ci_id'} );
442 my $course_reserves = $sth->fetchall_arrayref( {} );
444 $course_item->{'course_reserves'} = $course_reserves
445 if ($course_reserves);
447 return $course_item;
450 =head2 ModCourseItem {
452 ModCourseItem( %params );
454 Creates or modifies an existing course item.
456 =cut
458 sub ModCourseItem {
459 my (%params) = @_;
460 warn identify_myself(%params) if $DEBUG;
462 my $itemnumber = $params{'itemnumber'};
464 return unless ($itemnumber);
466 my $course_item = GetCourseItem( itemnumber => $itemnumber );
468 my $ci_id;
470 if ($course_item) {
471 $ci_id = $course_item->{'ci_id'};
473 _UpdateCourseItem(
474 ci_id => $ci_id,
475 course_item => $course_item,
476 %params
478 } else {
479 $ci_id = _AddCourseItem(%params);
482 return $ci_id;
486 =head2 _AddCourseItem
488 my $ci_id = _AddCourseItem( %params );
490 =cut
492 sub _AddCourseItem {
493 my (%params) = @_;
494 warn identify_myself(%params) if $DEBUG;
496 my ( @fields, @values );
498 push( @fields, 'itemnumber = ?' );
499 push( @values, $params{'itemnumber'} );
501 foreach (@FIELDS) {
502 push( @fields, "$_ = ?" );
503 push( @values, $params{$_} || undef );
506 my $query = "INSERT INTO course_items SET " . join( ',', @fields );
507 my $dbh = C4::Context->dbh;
508 $dbh->do( $query, undef, @values );
510 my $ci_id = $dbh->last_insert_id( undef, undef, 'course_items', 'ci_id' );
512 return $ci_id;
515 =head2 _UpdateCourseItem
517 _UpdateCourseItem( %params );
519 =cut
521 sub _UpdateCourseItem {
522 my (%params) = @_;
523 warn identify_myself(%params) if $DEBUG;
525 my $ci_id = $params{'ci_id'};
526 my $course_item = $params{'course_item'};
528 return unless ( $ci_id || $course_item );
530 $course_item = GetCourseItem( ci_id => $ci_id )
531 unless ($course_item);
532 $ci_id = $course_item->{'ci_id'} unless ($ci_id);
534 my %mod_params =
535 map {
536 defined $params{$_} && $params{$_} ne ''
537 ? ( $_ => $params{$_} )
538 : ()
539 } @FIELDS;
541 ModItem( \%mod_params, undef, $course_item->{'itemnumber'} );
544 =head2 _ModStoredFields
546 _ModStoredFields( %params );
548 Updates the values for the 'original' fields in course_items
549 for a given ci_id
551 =cut
553 sub _ModStoredFields {
554 my (%params) = @_;
555 warn identify_myself(%params) if $DEBUG;
557 return unless ( $params{'ci_id'} );
559 my ( @fields_to_update, @values_to_update );
561 foreach (@FIELDS) {
562 if ( defined($params{$_}) ) {
563 push( @fields_to_update, $_ );
564 push( @values_to_update, $params{$_} );
568 my $query = "UPDATE course_items SET " . join( ',', map { "$_=?" } @fields_to_update ) . " WHERE ci_id = ?";
570 C4::Context->dbh->do( $query, undef, @values_to_update, $params{'ci_id'} )
571 if (@values_to_update);
575 =head2 _RevertFields
577 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
579 =cut
581 sub _RevertFields {
582 my (%params) = @_;
583 warn identify_myself(%params) if $DEBUG;
585 my $ci_id = $params{'ci_id'};
587 return unless ($ci_id);
589 my $course_item = GetCourseItem( ci_id => $params{'ci_id'} );
591 my $mod_item_params;
592 foreach my $field ( @FIELDS ) {
593 $mod_item_params->{$field} = $course_item->{$field};
596 ModItem( $mod_item_params, undef, $course_item->{'itemnumber'} ) if $mod_item_params && %$mod_item_params;
599 =head2 _SwapAllFields
601 _SwapAllFields( $ci_id );
603 =cut
605 sub _SwapAllFields {
606 my ($ci_id) = @_;
607 warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG;
609 my $course_item = GetCourseItem( ci_id => $ci_id );
610 my $item = Koha::Items->find($course_item->{'itemnumber'});
612 my %course_item_fields;
613 my %item_fields;
614 foreach (@FIELDS) {
615 if ( defined( $course_item->{$_} ) ) {
616 $course_item_fields{$_} = $course_item->{$_};
617 $item_fields{$_} = $item->$_ || q{};
621 ModItem( \%course_item_fields, undef, $course_item->{'itemnumber'} ) if %course_item_fields;
622 _ModStoredFields( %item_fields, ci_id => $ci_id );
625 =head2 GetCourseItems {
627 $course_items = GetCourseItems(
628 [course_id => $course_id]
629 [, itemnumber => $itemnumber ]
632 =cut
634 sub GetCourseItems {
635 my (%params) = @_;
636 warn identify_myself(%params) if $DEBUG;
638 my $course_id = $params{'course_id'};
639 my $itemnumber = $params{'itemnumber'};
641 return unless ($course_id);
643 my @query_keys;
644 my @query_values;
646 my $query = "SELECT * FROM course_items";
648 if ( keys %params ) {
650 $query .= " WHERE ";
652 foreach my $key ( keys %params ) {
653 push( @query_keys, " $key LIKE ? " );
654 push( @query_values, $params{$key} );
657 $query .= join( ' AND ', @query_keys );
660 my $dbh = C4::Context->dbh;
661 my $sth = $dbh->prepare($query);
662 $sth->execute(@query_values);
664 return $sth->fetchall_arrayref( {} );
667 =head2 DelCourseItem {
669 DelCourseItem( ci_id => $cr_id );
671 =cut
673 sub DelCourseItem {
674 my (%params) = @_;
675 warn identify_myself(%params) if $DEBUG;
677 my $ci_id = $params{'ci_id'};
679 return unless ($ci_id);
681 _RevertFields( ci_id => $ci_id );
683 my $query = "
684 DELETE FROM course_items
685 WHERE ci_id = ?
687 C4::Context->dbh->do( $query, undef, $ci_id );
690 =head2 GetCourseReserve {
692 $course_item = GetCourseReserve( %params );
694 =cut
696 sub GetCourseReserve {
697 my (%params) = @_;
698 warn identify_myself(%params) if $DEBUG;
700 my $cr_id = $params{'cr_id'};
701 my $course_id = $params{'course_id'};
702 my $ci_id = $params{'ci_id'};
704 return unless ( $cr_id || ( $course_id && $ci_id ) );
706 my $dbh = C4::Context->dbh;
707 my $sth;
709 if ($cr_id) {
710 my $query = "
711 SELECT * FROM course_reserves
712 WHERE cr_id = ?
714 $sth = $dbh->prepare($query);
715 $sth->execute($cr_id);
716 } else {
717 my $query = "
718 SELECT * FROM course_reserves
719 WHERE course_id = ? AND ci_id = ?
721 $sth = $dbh->prepare($query);
722 $sth->execute( $course_id, $ci_id );
725 my $course_reserve = $sth->fetchrow_hashref();
726 return $course_reserve;
729 =head2 ModCourseReserve
731 $id = ModCourseReserve( %params );
733 =cut
735 sub ModCourseReserve {
736 my (%params) = @_;
737 warn identify_myself(%params) if $DEBUG;
739 my $course_id = $params{'course_id'};
740 my $ci_id = $params{'ci_id'};
741 my $staff_note = $params{'staff_note'};
742 my $public_note = $params{'public_note'};
744 return unless ( $course_id && $ci_id );
746 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
747 my $cr_id;
749 my $dbh = C4::Context->dbh;
751 if ($course_reserve) {
752 $cr_id = $course_reserve->{'cr_id'};
754 my $query = "
755 UPDATE course_reserves
756 SET staff_note = ?, public_note = ?
757 WHERE cr_id = ?
759 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
760 } else {
761 my $query = "
762 INSERT INTO course_reserves SET
763 course_id = ?,
764 ci_id = ?,
765 staff_note = ?,
766 public_note = ?
768 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
769 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
772 EnableOrDisableCourseItem(
773 ci_id => $params{'ci_id'},
776 return $cr_id;
779 =head2 GetCourseReserves {
781 $course_reserves = GetCourseReserves( %params );
783 Required:
784 course_id OR ci_id
785 Optional:
786 include_items => 1,
787 include_count => 1,
788 include_courses => 1,
790 =cut
792 sub GetCourseReserves {
793 my (%params) = @_;
794 warn identify_myself(%params) if $DEBUG;
796 my $course_id = $params{'course_id'};
797 my $ci_id = $params{'ci_id'};
798 my $include_items = $params{'include_items'};
799 my $include_count = $params{'include_count'};
800 my $include_courses = $params{'include_courses'};
802 return unless ( $course_id || $ci_id );
804 my $field = ($course_id) ? 'course_id' : 'ci_id';
805 my $value = ($course_id) ? $course_id : $ci_id;
807 my $query = "
808 SELECT cr.*, ci.itemnumber
809 FROM course_reserves cr, course_items ci
810 WHERE cr.$field = ?
811 AND cr.ci_id = ci.ci_id
813 my $dbh = C4::Context->dbh;
814 my $sth = $dbh->prepare($query);
815 $sth->execute($value);
817 my $course_reserves = $sth->fetchall_arrayref( {} );
819 if ($include_items) {
820 foreach my $cr (@$course_reserves) {
821 my $item = Koha::Items->find( $cr->{itemnumber} );
822 my $biblio = $item->biblio;
823 my $biblioitem = $biblio->biblioitem;
824 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
825 $cr->{'item'} = $item;
826 $cr->{'biblio'} = $biblio;
827 $cr->{'biblioitem'} = $biblioitem;
828 $cr->{'issue'} = GetOpenIssue( $cr->{'itemnumber'} );
832 if ($include_count) {
833 foreach my $cr (@$course_reserves) {
834 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
838 if ($include_courses) {
839 foreach my $cr (@$course_reserves) {
840 $cr->{'courses'} = GetCourses( itemnumber => $cr->{'itemnumber'} );
844 return $course_reserves;
847 =head2 DelCourseReserve {
849 DelCourseReserve( cr_id => $cr_id );
851 =cut
853 sub DelCourseReserve {
854 my (%params) = @_;
855 warn identify_myself(%params) if $DEBUG;
857 my $cr_id = $params{'cr_id'};
859 return unless ($cr_id);
861 my $dbh = C4::Context->dbh;
863 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
865 my $query = "
866 DELETE FROM course_reserves
867 WHERE cr_id = ?
869 $dbh->do( $query, undef, $cr_id );
871 ## If there are no other course reserves for this item
872 ## delete the course_item as well
873 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
874 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
879 =head2 GetItemCourseReservesInfo
881 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
883 For a given item, returns an arrayref of reserves hashrefs,
884 with a course hashref under the key 'course'
886 =cut
888 sub GetItemCourseReservesInfo {
889 my (%params) = @_;
890 warn identify_myself(%params) if $DEBUG;
892 my $itemnumber = $params{'itemnumber'};
894 return unless ($itemnumber);
896 my $course_item = GetCourseItem( itemnumber => $itemnumber );
898 return unless ( keys %$course_item );
900 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
902 foreach my $cr (@$course_reserves) {
903 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
906 return $course_reserves;
909 =head2 CountCourseReservesForItem
911 $bool = CountCourseReservesForItem( %params );
913 ci_id - course_item id
915 itemnumber - course_item itemnumber
917 enabled = 'yes' or 'no'
918 Optional, if not supplied, counts reserves
919 for both enabled and disabled courses
921 =cut
923 sub CountCourseReservesForItem {
924 my (%params) = @_;
925 warn identify_myself(%params) if $DEBUG;
927 my $ci_id = $params{'ci_id'};
928 my $itemnumber = $params{'itemnumber'};
929 my $enabled = $params{'enabled'};
931 return unless ( $ci_id || $itemnumber );
933 my $course_item = GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber );
935 my @params = ( $course_item->{'ci_id'} );
936 push( @params, $enabled ) if ($enabled);
938 my $query = "
939 SELECT COUNT(*) AS count
940 FROM course_reserves cr
941 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
942 WHERE ci_id = ?
944 $query .= "AND c.enabled = ?" if ($enabled);
946 my $dbh = C4::Context->dbh;
947 my $sth = $dbh->prepare($query);
948 $sth->execute(@params);
950 my $row = $sth->fetchrow_hashref();
952 return $row->{'count'};
955 =head2 SearchCourses
957 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
959 =cut
961 sub SearchCourses {
962 my (%params) = @_;
963 warn identify_myself(%params) if $DEBUG;
965 my $term = $params{'term'};
967 my $enabled = $params{'enabled'} || '%';
969 my @params;
970 my $query = "
971 SELECT c.course_id, c.department, c.course_number, c.section, c.course_name, c.term, c.staff_note, c.public_note, c.students_count, c.enabled, c.timestamp
972 FROM courses c
973 LEFT JOIN course_instructors ci
974 ON ( c.course_id = ci.course_id )
975 LEFT JOIN borrowers b
976 ON ( ci.borrowernumber = b.borrowernumber )
977 LEFT JOIN authorised_values av
978 ON ( c.department = av.authorised_value )
979 WHERE
980 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
983 department LIKE ? OR
984 course_number LIKE ? OR
985 section LIKE ? OR
986 course_name LIKE ? OR
987 term LIKE ? OR
988 public_note LIKE ? OR
989 CONCAT(surname,' ',firstname) LIKE ? OR
990 CONCAT(firstname,' ',surname) LIKE ? OR
991 lib LIKE ? OR
992 lib_opac LIKE ?
995 c.enabled LIKE ?
996 GROUP BY c.course_id, c.department, c.course_number, c.section, c.course_name, c.term, c.staff_note, c.public_note, c.students_count, c.enabled, c.timestamp
999 $term //= '';
1000 $term = "%$term%";
1001 @params = ($term) x 10;
1003 $query .= " ORDER BY department, course_number, section, term, course_name ";
1005 my $dbh = C4::Context->dbh;
1006 my $sth = $dbh->prepare($query);
1008 $sth->execute( @params, $enabled );
1010 my $courses = $sth->fetchall_arrayref( {} );
1012 foreach my $c (@$courses) {
1013 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1016 return $courses;
1019 sub whoami { ( caller(1) )[3] }
1020 sub whowasi { ( caller(2) )[3] }
1022 sub stringify_params {
1023 my (%params) = @_;
1025 my $string = "\n";
1027 foreach my $key ( keys %params ) {
1028 $string .= " $key => " . $params{$key} . "\n";
1031 return "( $string )";
1034 sub identify_myself {
1035 my (%params) = @_;
1037 return whowasi() . stringify_params(%params);
1042 =head1 AUTHOR
1044 Kyle M Hall <kyle@bywatersolutions.com>
1046 =cut