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>.
20 use List::MoreUtils qw(any);
23 use C4::Circulation qw(GetOpenIssue);
26 use Koha::Course::Instructors;
27 use Koha::Course::Items;
28 use Koha::Course::Reserves;
30 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG @FIELDS);
54 &GetItemCourseReservesInfo
56 %EXPORT_TAGS = ( 'all' => \@EXPORT_OK );
59 @FIELDS = ( 'itype', 'ccode', 'homebranch', 'holdingbranch', 'location' );
64 C4::CourseReserves - Koha course reserves module
68 use C4::CourseReserves;
72 This module deals with course reserves.
78 $course = GetCourse( $course_id );
84 warn whoami() . "( $course_id )" if $DEBUG;
86 my $course = Koha::Courses->find( $course_id );
87 return undef unless $course;
88 $course = $course->unblessed;
90 my $dbh = C4::Context->dbh;
92 SELECT b.* FROM course_instructors ci
93 LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber )
96 my $sth = $dbh->prepare($query);
97 $sth->execute($course_id);
98 $course->{'instructors'} = $sth->fetchall_arrayref( {} );
105 ModCourse( [ course_id => $id ] [, course_name => $course_name ] [etc...] );
111 warn identify_myself(%params) if $DEBUG;
113 my $dbh = C4::Context->dbh;
116 if ( defined $params{'course_id'} ) {
117 $course_id = $params{'course_id'};
118 delete $params{'course_id'};
126 $query .= ($course_id) ? ' UPDATE ' : ' INSERT ';
127 $query .= ' courses SET ';
129 foreach my $key ( keys %params ) {
130 push( @query_keys, "$key=?" );
131 push( @query_values, $params{$key} );
133 $query .= join( ',', @query_keys );
136 $query .= " WHERE course_id = ?";
137 push( @query_values, $course_id );
140 $dbh->do( $query, undef, @query_values );
142 $course_id = $course_id
143 || $dbh->last_insert_id( undef, undef, 'courses', 'course_id' );
145 EnableOrDisableCourseItems(
146 course_id => $course_id,
147 enabled => $params{'enabled'}
155 @courses = GetCourses( [ fieldname => $value ] [, fieldname2 => $value2 ] [etc...] );
161 warn identify_myself(%params) if $DEBUG;
167 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
169 LEFT JOIN course_reserves ON course_reserves.course_id = c.course_id
170 LEFT JOIN course_items ON course_items.ci_id = course_reserves.ci_id
173 if ( keys %params ) {
177 foreach my $key ( keys %params ) {
178 push( @query_keys, " $key LIKE ? " );
179 push( @query_values, $params{$key} );
182 $query .= join( ' AND ', @query_keys );
185 $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 ";
187 my $dbh = C4::Context->dbh;
188 my $sth = $dbh->prepare($query);
189 $sth->execute(@query_values);
191 my $courses = $sth->fetchall_arrayref( {} );
193 foreach my $c (@$courses) {
194 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
202 DelCourse( $course_id );
207 my ($course_id) = @_;
209 my $course_reserves = GetCourseReserves( course_id => $course_id );
211 foreach my $res (@$course_reserves) {
212 DelCourseReserve( cr_id => $res->{'cr_id'} );
216 DELETE FROM course_instructors
219 C4::Context->dbh->do( $query, undef, $course_id );
225 C4::Context->dbh->do( $query, undef, $course_id );
228 =head2 EnableOrDisableCourseItems
230 EnableOrDisableCourseItems( course_id => $course_id, enabled => $enabled );
232 For each item on reserve for this course,
233 if the course item has no active course reserves,
234 swap the fields for the item to make it 'normal'
237 enabled => 'yes' to enable course items
238 enabled => 'no' to disable course items
242 sub EnableOrDisableCourseItems {
244 warn identify_myself(%params) if $DEBUG;
246 my $course_id = $params{'course_id'};
247 my $enabled = $params{'enabled'} || 0;
249 my $lookfor = ( $enabled eq 'yes' ) ? 'no' : 'yes';
251 return unless ( $course_id && $enabled );
252 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
254 my $course_reserves = GetCourseReserves( course_id => $course_id );
256 if ( $enabled eq 'yes' ) {
257 foreach my $course_reserve (@$course_reserves) {
258 if (CountCourseReservesForItem(
259 ci_id => $course_reserve->{'ci_id'},
263 EnableOrDisableCourseItem(
264 ci_id => $course_reserve->{'ci_id'},
269 if ( $enabled eq 'no' ) {
270 foreach my $course_reserve (@$course_reserves) {
272 CountCourseReservesForItem(
273 ci_id => $course_reserve->{'ci_id'},
277 EnableOrDisableCourseItem(
278 ci_id => $course_reserve->{'ci_id'},
285 =head2 EnableOrDisableCourseItem
287 EnableOrDisableCourseItem( ci_id => $ci_id );
291 sub EnableOrDisableCourseItem {
293 warn identify_myself(%params) if $DEBUG;
295 my $ci_id = $params{'ci_id'};
297 return unless ( $ci_id );
299 my $course_item = GetCourseItem( ci_id => $ci_id );
301 my $info = GetItemCourseReservesInfo( itemnumber => $course_item->{itemnumber} );
303 my $enabled = any { $_->{course}->{enabled} eq 'yes' } @$info;
304 $enabled = $enabled ? 'yes' : 'no';
306 ## We don't want to 'enable' an already enabled item,
307 ## or disable and already disabled item,
308 ## as that would cause the fields to swap
309 if ( $course_item->{'enabled'} ne $enabled ) {
310 _SwapAllFields($ci_id, $enabled );
318 C4::Context->dbh->do( $query, undef, $enabled, $ci_id );
324 =head2 GetCourseInstructors
326 @$borrowers = GetCourseInstructors( $course_id );
330 sub GetCourseInstructors {
331 my ($course_id) = @_;
332 warn "C4::CourseReserves::GetCourseInstructors( $course_id )"
336 SELECT * FROM borrowers
337 RIGHT JOIN course_instructors ON ( course_instructors.borrowernumber = borrowers.borrowernumber )
338 WHERE course_instructors.course_id = ?
341 my $dbh = C4::Context->dbh;
342 my $sth = $dbh->prepare($query);
343 $sth->execute($course_id);
345 return $sth->fetchall_arrayref( {} );
348 =head2 ModCourseInstructors
350 ModCourseInstructors( mode => $mode, course_id => $course_id, [ cardnumbers => $cardnumbers ] OR [ borrowernumbers => $borrowernumbers );
352 $mode can be 'replace', 'add', or 'delete'
354 $cardnumbers and $borrowernumbers are both references to arrays
356 Use either cardnumbers or borrowernumber, but not both.
360 sub ModCourseInstructors {
362 warn identify_myself(%params) if $DEBUG;
364 my $course_id = $params{'course_id'};
365 my $mode = $params{'mode'};
366 my $cardnumbers = $params{'cardnumbers'};
367 my $borrowernumbers = $params{'borrowernumbers'};
369 return unless ($course_id);
371 unless ( $mode eq 'replace'
373 || $mode eq 'delete' );
374 return unless ( $cardnumbers || $borrowernumbers );
375 return if ( $cardnumbers && $borrowernumbers );
377 my ( @cardnumbers, @borrowernumbers );
378 @cardnumbers = @$cardnumbers if ( ref($cardnumbers) eq 'ARRAY' );
379 @borrowernumbers = @$borrowernumbers
380 if ( ref($borrowernumbers) eq 'ARRAY' );
382 my $field = (@cardnumbers) ? 'cardnumber' : 'borrowernumber';
383 my @fields = (@cardnumbers) ? @cardnumbers : @borrowernumbers;
384 my $placeholders = join( ',', ('?') x scalar @fields );
386 my $dbh = C4::Context->dbh;
388 $dbh->do( "DELETE FROM course_instructors WHERE course_id = ?", undef, $course_id )
389 if ( $mode eq 'replace' );
393 if ( $mode eq 'add' || $mode eq 'replace' ) {
395 INSERT INTO course_instructors ( course_id, borrowernumber )
396 SELECT ?, borrowernumber
398 WHERE $field IN ( $placeholders )
402 DELETE FROM course_instructors
404 AND borrowernumber IN (
405 SELECT borrowernumber FROM borrowers WHERE $field IN ( $placeholders )
410 my $sth = $dbh->prepare($query);
412 $sth->execute( $course_id, @fields ) if (@fields);
415 =head2 GetCourseItem {
417 $course_item = GetCourseItem( itemnumber => $itemnumber [, ci_id => $ci_id );
423 warn identify_myself(%params) if $DEBUG;
425 my $ci_id = $params{'ci_id'};
426 my $itemnumber = $params{'itemnumber'};
428 return unless ( $itemnumber || $ci_id );
430 my $field = ($itemnumber) ? 'itemnumber' : 'ci_id';
431 my $value = ($itemnumber) ? $itemnumber : $ci_id;
433 my $query = "SELECT * FROM course_items WHERE $field = ?";
434 my $dbh = C4::Context->dbh;
435 my $sth = $dbh->prepare($query);
436 $sth->execute($value);
438 my $course_item = $sth->fetchrow_hashref();
441 $query = "SELECT * FROM course_reserves WHERE ci_id = ?";
442 $sth = $dbh->prepare($query);
443 $sth->execute( $course_item->{'ci_id'} );
444 my $course_reserves = $sth->fetchall_arrayref( {} );
446 $course_item->{'course_reserves'} = $course_reserves
447 if ($course_reserves);
452 =head2 ModCourseItem {
454 ModCourseItem( %params );
456 Creates or modifies an existing course item.
462 warn identify_myself(%params) if $DEBUG;
464 my $itemnumber = $params{'itemnumber'};
466 return unless ($itemnumber);
468 my $course_item = GetCourseItem( itemnumber => $itemnumber );
473 $ci_id = $course_item->{'ci_id'};
477 course_item => $course_item,
481 $ci_id = _AddCourseItem(%params);
488 =head2 _AddCourseItem
490 my $ci_id = _AddCourseItem( %params );
496 warn identify_myself(%params) if $DEBUG;
498 $params{homebranch} ||= undef; # Can't be empty string, FK constraint
499 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
501 my %data = map { $_ => $params{$_} } @FIELDS;
502 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
504 my $ci = Koha::Course::Item->new(
506 itemnumber => $params{itemnumber},
515 =head2 _UpdateCourseItem
517 _UpdateCourseItem( %params );
521 sub _UpdateCourseItem {
523 warn identify_myself(%params) if $DEBUG;
525 my $ci_id = $params{'ci_id'};
526 my $course_item = $params{'course_item'};
528 $params{homebranch} ||= undef; # Can't be empty string, FK constraint
529 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
531 return unless ( $ci_id || $course_item );
533 $course_item = Koha::Course::Items->find( $ci_id || $course_item->{ci_id} );
535 my %data = map { $_ => $params{$_} } @FIELDS;
536 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
538 my $item = Koha::Items->find( $course_item->itemnumber );
540 # Handle updates to changed fields for a course item, both adding and removing
541 if ( $course_item->is_enabled ) {
542 my $item_fields = {};
544 # Find newly enabled field and add item value to storage
545 if ( $params{itype_enabled} && !$course_item->itype_enabled ) {
546 $enabled{itype_storage} = $item->itype;
547 $item_fields->{itype} = $params{itype};
549 # Find newly disabled field and copy the storage value to the item, unset storage value
550 elsif ( !$params{itype_enabled} && $course_item->itype_enabled ) {
551 $item_fields->{itype} = $course_item->itype_storage;
552 $enabled{itype_storage} = undef;
554 # The field was already enabled, copy the incoming value to the item.
555 # The "original" ( when not on course reserve ) value is already in the storage field
556 elsif ( $course_item->itype_enabled) {
557 $item_fields->{itype} = $params{itype};
560 if ( $params{ccode_enabled} && !$course_item->ccode_enabled ) {
561 $enabled{ccode_storage} = $item->ccode;
562 $item_fields->{ccode} = $params{ccode};
564 elsif ( !$params{ccode_enabled} && $course_item->ccode_enabled ) {
565 $item_fields->{ccode} = $course_item->ccode_storage;
566 $enabled{ccode_storage} = undef;
567 } elsif ( $course_item->ccode_enabled) {
568 $item_fields->{ccode} = $params{ccode};
571 if ( $params{location_enabled} && !$course_item->location_enabled ) {
572 $enabled{location_storage} = $item->location;
573 $item_fields->{location} = $params{location};
575 elsif ( !$params{location_enabled} && $course_item->location_enabled ) {
576 $item_fields->{location} = $course_item->location_storage;
577 $enabled{location_storage} = undef;
578 } elsif ( $course_item->location_enabled) {
579 $item_fields->{location} = $params{location};
582 if ( $params{homebranch_enabled} && !$course_item->homebranch_enabled ) {
583 $enabled{homebranch_storage} = $item->homebranch;
584 $item_fields->{homebranch} = $params{homebranch};
586 elsif ( !$params{homebranch_enabled} && $course_item->homebranch_enabled ) {
587 $item_fields->{homebranch} = $course_item->homebranch_storage;
588 $enabled{homebranch_storage} = undef;
589 } elsif ( $course_item->homebranch_enabled) {
590 $item_fields->{homebranch} = $params{homebranch};
593 if ( $params{holdingbranch_enabled} && !$course_item->holdingbranch_enabled ) {
594 $enabled{holdingbranch_storage} = $item->holdingbranch;
595 $item_fields->{holdingbranch} = $params{holdingbranch};
597 elsif ( !$params{holdingbranch_enabled} && $course_item->holdingbranch_enabled ) {
598 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage;
599 $enabled{holdingbranch_storage} = undef;
600 } elsif ( $course_item->holdingbranch_enabled) {
601 $item_fields->{holdingbranch} = $params{holdingbranch};
604 $item->set( $item_fields )->store
605 if keys %$item_fields;
608 $course_item->update( { %data, %enabled } );
614 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
616 Copies fields from course item storage back to the actual item
622 warn identify_myself(%params) if $DEBUG;
624 my $ci_id = $params{'ci_id'};
626 return unless $ci_id;
628 my $course_item = Koha::Course::Items->find( $ci_id );
630 my $item_fields = {};
631 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
632 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
633 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
634 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
635 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
637 Koha::Items->find( $course_item->itemnumber )
638 ->set( $item_fields )
640 if keys %$item_fields;
642 $course_item->itype_storage(undef);
643 $course_item->ccode_storage(undef);
644 $course_item->location_storage(undef);
645 $course_item->homebranch_storage(undef);
646 $course_item->holdingbranch_storage(undef);
647 $course_item->store();
650 =head2 _SwapAllFields
652 _SwapAllFields( $ci_id );
657 my ( $ci_id, $enabled ) = @_;
658 warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG;
660 my $course_item = Koha::Course::Items->find( $ci_id );
661 my $item = Koha::Items->find( $course_item->itemnumber );
663 if ( $enabled eq 'yes' ) { # Copy item fields to course item storage, course item fields to item
664 $course_item->itype_storage( $item->effective_itemtype ) if $course_item->itype_enabled;
665 $course_item->ccode_storage( $item->ccode ) if $course_item->ccode_enabled;
666 $course_item->location_storage( $item->location ) if $course_item->location_enabled;
667 $course_item->homebranch_storage( $item->homebranch ) if $course_item->homebranch_enabled;
668 $course_item->holdingbranch_storage( $item->holdingbranch ) if $course_item->holdingbranch_enabled;
669 $course_item->store();
671 my $item_fields = {};
672 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
673 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
674 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
675 $item_fields->{homebranch} = $course_item->homebranch if $course_item->homebranch_enabled;
676 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
678 Koha::Items->find( $course_item->itemnumber )
679 ->set( $item_fields )
681 if keys %$item_fields;
683 } else { # Copy course item storage to item
684 my $item_fields = {};
685 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
686 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
687 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
688 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
689 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
691 Koha::Items->find( $course_item->itemnumber )
692 ->set( $item_fields )
694 if keys %$item_fields;
696 $course_item->itype_storage(undef);
697 $course_item->ccode_storage(undef);
698 $course_item->location_storage(undef);
699 $course_item->homebranch_storage(undef);
700 $course_item->holdingbranch_storage(undef);
701 $course_item->store();
705 =head2 GetCourseItems {
707 $course_items = GetCourseItems(
708 [course_id => $course_id]
709 [, itemnumber => $itemnumber ]
716 warn identify_myself(%params) if $DEBUG;
718 my $course_id = $params{'course_id'};
719 my $itemnumber = $params{'itemnumber'};
721 return unless ($course_id);
726 my $query = "SELECT * FROM course_items";
728 if ( keys %params ) {
732 foreach my $key ( keys %params ) {
733 push( @query_keys, " $key LIKE ? " );
734 push( @query_values, $params{$key} );
737 $query .= join( ' AND ', @query_keys );
740 my $dbh = C4::Context->dbh;
741 my $sth = $dbh->prepare($query);
742 $sth->execute(@query_values);
744 return $sth->fetchall_arrayref( {} );
747 =head2 DelCourseItem {
749 DelCourseItem( ci_id => $cr_id );
755 warn identify_myself(%params) if $DEBUG;
757 my $ci_id = $params{'ci_id'};
759 return unless ($ci_id);
761 my $course_item = Koha::Course::Items->find( $ci_id );
762 return unless $course_item;
764 _RevertFields( ci_id => $ci_id ) if $course_item->enabled eq 'yes';
767 DELETE FROM course_items
770 C4::Context->dbh->do( $query, undef, $ci_id );
773 =head2 GetCourseReserve {
775 $course_item = GetCourseReserve( %params );
779 sub GetCourseReserve {
781 warn identify_myself(%params) if $DEBUG;
783 my $cr_id = $params{'cr_id'};
784 my $course_id = $params{'course_id'};
785 my $ci_id = $params{'ci_id'};
787 return unless ( $cr_id || ( $course_id && $ci_id ) );
789 my $dbh = C4::Context->dbh;
794 SELECT * FROM course_reserves
797 $sth = $dbh->prepare($query);
798 $sth->execute($cr_id);
801 SELECT * FROM course_reserves
802 WHERE course_id = ? AND ci_id = ?
804 $sth = $dbh->prepare($query);
805 $sth->execute( $course_id, $ci_id );
808 my $course_reserve = $sth->fetchrow_hashref();
809 return $course_reserve;
812 =head2 ModCourseReserve
814 $id = ModCourseReserve( %params );
818 sub ModCourseReserve {
820 warn identify_myself(%params) if $DEBUG;
822 my $course_id = $params{'course_id'};
823 my $ci_id = $params{'ci_id'};
824 my $staff_note = $params{'staff_note'};
825 my $public_note = $params{'public_note'};
827 return unless ( $course_id && $ci_id );
829 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
832 my $dbh = C4::Context->dbh;
834 if ($course_reserve) {
835 $cr_id = $course_reserve->{'cr_id'};
838 UPDATE course_reserves
839 SET staff_note = ?, public_note = ?
842 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
845 INSERT INTO course_reserves SET
851 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
852 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
855 EnableOrDisableCourseItem(
856 ci_id => $params{'ci_id'},
862 =head2 GetCourseReserves {
864 $course_reserves = GetCourseReserves( %params );
871 include_courses => 1,
875 sub GetCourseReserves {
877 warn identify_myself(%params) if $DEBUG;
879 my $course_id = $params{'course_id'};
880 my $ci_id = $params{'ci_id'};
881 my $include_items = $params{'include_items'};
882 my $include_count = $params{'include_count'};
883 my $include_courses = $params{'include_courses'};
885 return unless ( $course_id || $ci_id );
887 my $field = ($course_id) ? 'course_id' : 'ci_id';
888 my $value = ($course_id) ? $course_id : $ci_id;
891 SELECT cr.*, ci.itemnumber
892 FROM course_reserves cr, course_items ci
894 AND cr.ci_id = ci.ci_id
896 my $dbh = C4::Context->dbh;
897 my $sth = $dbh->prepare($query);
898 $sth->execute($value);
900 my $course_reserves = $sth->fetchall_arrayref( {} );
902 if ($include_items) {
903 foreach my $cr (@$course_reserves) {
904 my $item = Koha::Items->find( $cr->{itemnumber} );
905 my $biblio = $item->biblio;
906 my $biblioitem = $biblio->biblioitem;
907 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
908 $cr->{'item'} = $item;
909 $cr->{'biblio'} = $biblio;
910 $cr->{'biblioitem'} = $biblioitem;
911 $cr->{'issue'} = GetOpenIssue( $cr->{'itemnumber'} );
915 if ($include_count) {
916 foreach my $cr (@$course_reserves) {
917 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
921 if ($include_courses) {
922 foreach my $cr (@$course_reserves) {
923 $cr->{'courses'} = GetCourses( itemnumber => $cr->{'itemnumber'} );
927 return $course_reserves;
930 =head2 DelCourseReserve {
932 DelCourseReserve( cr_id => $cr_id );
936 sub DelCourseReserve {
938 warn identify_myself(%params) if $DEBUG;
940 my $cr_id = $params{'cr_id'};
942 return unless ($cr_id);
944 my $dbh = C4::Context->dbh;
946 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
949 DELETE FROM course_reserves
952 $dbh->do( $query, undef, $cr_id );
954 ## If there are no other course reserves for this item
955 ## delete the course_item as well
956 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
957 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
962 =head2 GetItemCourseReservesInfo
964 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
966 For a given item, returns an arrayref of reserves hashrefs,
967 with a course hashref under the key 'course'
971 sub GetItemCourseReservesInfo {
973 warn identify_myself(%params) if $DEBUG;
975 my $itemnumber = $params{'itemnumber'};
977 return unless ($itemnumber);
979 my $course_item = GetCourseItem( itemnumber => $itemnumber );
981 return unless ( keys %$course_item );
983 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
985 foreach my $cr (@$course_reserves) {
986 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
989 return $course_reserves;
992 =head2 CountCourseReservesForItem
994 $bool = CountCourseReservesForItem( %params );
996 ci_id - course_item id
998 itemnumber - course_item itemnumber
1000 enabled = 'yes' or 'no'
1001 Optional, if not supplied, counts reserves
1002 for both enabled and disabled courses
1006 sub CountCourseReservesForItem {
1008 warn identify_myself(%params) if $DEBUG;
1010 my $ci_id = $params{'ci_id'};
1011 my $itemnumber = $params{'itemnumber'};
1012 my $enabled = $params{'enabled'};
1014 return unless ( $ci_id || $itemnumber );
1016 my $course_item = GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber );
1018 my @params = ( $course_item->{'ci_id'} );
1019 push( @params, $enabled ) if ($enabled);
1022 SELECT COUNT(*) AS count
1023 FROM course_reserves cr
1024 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
1027 $query .= "AND c.enabled = ?" if ($enabled);
1029 my $dbh = C4::Context->dbh;
1030 my $sth = $dbh->prepare($query);
1031 $sth->execute(@params);
1033 my $row = $sth->fetchrow_hashref();
1035 return $row->{'count'};
1038 =head2 SearchCourses
1040 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
1046 warn identify_myself(%params) if $DEBUG;
1048 my $term = $params{'term'};
1050 my $enabled = $params{'enabled'} || '%';
1054 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
1056 LEFT JOIN course_instructors ci
1057 ON ( c.course_id = ci.course_id )
1058 LEFT JOIN borrowers b
1059 ON ( ci.borrowernumber = b.borrowernumber )
1060 LEFT JOIN authorised_values av
1061 ON ( c.department = av.authorised_value )
1063 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
1066 department LIKE ? OR
1067 course_number LIKE ? OR
1069 course_name LIKE ? OR
1071 public_note LIKE ? OR
1072 CONCAT(surname,' ',firstname) LIKE ? OR
1073 CONCAT(firstname,' ',surname) LIKE ? OR
1079 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
1084 @params = ($term) x 10;
1086 $query .= " ORDER BY department, course_number, section, term, course_name ";
1088 my $dbh = C4::Context->dbh;
1089 my $sth = $dbh->prepare($query);
1091 $sth->execute( @params, $enabled );
1093 my $courses = $sth->fetchall_arrayref( {} );
1095 foreach my $c (@$courses) {
1096 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1102 sub whoami { ( caller(1) )[3] }
1103 sub whowasi { ( caller(2) )[3] }
1105 sub stringify_params {
1110 foreach my $key ( keys %params ) {
1111 $string .= " $key => " . $params{$key} . "\n";
1114 return "( $string )";
1117 sub identify_myself {
1120 return whowasi() . stringify_params(%params);
1127 Kyle M Hall <kyle@bywatersolutions.com>