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 @FIELDS);
54 &GetItemCourseReservesInfo
56 %EXPORT_TAGS = ( 'all' => \@EXPORT_OK );
58 @FIELDS = ( 'itype', 'ccode', 'homebranch', 'holdingbranch', 'location' );
63 C4::CourseReserves - Koha course reserves module
67 use C4::CourseReserves;
71 This module deals with course reserves.
77 $course = GetCourse( $course_id );
84 my $course = Koha::Courses->find( $course_id );
85 return unless $course;
86 $course = $course->unblessed;
88 my $dbh = C4::Context->dbh;
90 SELECT b.* FROM course_instructors ci
91 LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber )
94 my $sth = $dbh->prepare($query);
95 $sth->execute($course_id);
96 $course->{'instructors'} = $sth->fetchall_arrayref( {} );
103 ModCourse( [ course_id => $id ] [, course_name => $course_name ] [etc...] );
110 my $dbh = C4::Context->dbh;
113 if ( defined $params{'course_id'} ) {
114 $course_id = $params{'course_id'};
115 delete $params{'course_id'};
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 );
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'}
152 @courses = GetCourses( [ fieldname => $value ] [, fieldname2 => $value2 ] [etc...] );
163 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
165 LEFT JOIN course_reserves ON course_reserves.course_id = c.course_id
166 LEFT JOIN course_items ON course_items.ci_id = course_reserves.ci_id
169 if ( keys %params ) {
173 foreach my $key ( keys %params ) {
174 push( @query_keys, " $key LIKE ? " );
175 push( @query_values, $params{$key} );
178 $query .= join( ' AND ', @query_keys );
181 $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 ";
183 my $dbh = C4::Context->dbh;
184 my $sth = $dbh->prepare($query);
185 $sth->execute(@query_values);
187 my $courses = $sth->fetchall_arrayref( {} );
189 foreach my $c (@$courses) {
190 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
198 DelCourse( $course_id );
203 my ($course_id) = @_;
205 my $course_reserves = GetCourseReserves( course_id => $course_id );
207 foreach my $res (@$course_reserves) {
208 DelCourseReserve( cr_id => $res->{'cr_id'} );
212 DELETE FROM course_instructors
215 C4::Context->dbh->do( $query, undef, $course_id );
221 C4::Context->dbh->do( $query, undef, $course_id );
224 =head2 EnableOrDisableCourseItems
226 EnableOrDisableCourseItems( course_id => $course_id, enabled => $enabled );
228 For each item on reserve for this course,
229 if the course item has no active course reserves,
230 swap the fields for the item to make it 'normal'
233 enabled => 'yes' to enable course items
234 enabled => 'no' to disable course items
238 sub EnableOrDisableCourseItems {
241 my $course_id = $params{'course_id'};
242 my $enabled = $params{'enabled'} || 0;
244 my $lookfor = ( $enabled eq 'yes' ) ? 'no' : 'yes';
246 return unless ( $course_id && $enabled );
247 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
249 my $course_reserves = GetCourseReserves( course_id => $course_id );
251 if ( $enabled eq 'yes' ) {
252 foreach my $course_reserve (@$course_reserves) {
253 if (CountCourseReservesForItem(
254 ci_id => $course_reserve->{'ci_id'},
258 EnableOrDisableCourseItem(
259 ci_id => $course_reserve->{'ci_id'},
264 if ( $enabled eq 'no' ) {
265 foreach my $course_reserve (@$course_reserves) {
267 CountCourseReservesForItem(
268 ci_id => $course_reserve->{'ci_id'},
272 EnableOrDisableCourseItem(
273 ci_id => $course_reserve->{'ci_id'},
280 =head2 EnableOrDisableCourseItem
282 EnableOrDisableCourseItem( ci_id => $ci_id );
286 sub EnableOrDisableCourseItem {
289 my $ci_id = $params{'ci_id'};
291 return unless ( $ci_id );
293 my $course_item = GetCourseItem( ci_id => $ci_id );
295 my $info = $course_item->{itemnumber} ? GetItemCourseReservesInfo( itemnumber => $course_item->{itemnumber} ) : GetItemCourseReservesInfo( biblionumber => $course_item->{biblionumber} );
297 my $enabled = any { $_->{course}->{enabled} eq 'yes' } @$info;
298 $enabled = $enabled ? 'yes' : 'no';
300 ## We don't want to 'enable' an already enabled item,
301 ## or disable and already disabled item,
302 ## as that would cause the fields to swap
303 if ( $course_item->{'enabled'} ne $enabled ) {
304 _SwapAllFields($ci_id, $enabled );
312 C4::Context->dbh->do( $query, undef, $enabled, $ci_id );
318 =head2 GetCourseInstructors
320 @$borrowers = GetCourseInstructors( $course_id );
324 sub GetCourseInstructors {
325 my ($course_id) = @_;
328 SELECT * FROM borrowers
329 RIGHT JOIN course_instructors ON ( course_instructors.borrowernumber = borrowers.borrowernumber )
330 WHERE course_instructors.course_id = ?
333 my $dbh = C4::Context->dbh;
334 my $sth = $dbh->prepare($query);
335 $sth->execute($course_id);
337 return $sth->fetchall_arrayref( {} );
340 =head2 ModCourseInstructors
342 ModCourseInstructors( mode => $mode, course_id => $course_id, [ cardnumbers => $cardnumbers ] OR [ borrowernumbers => $borrowernumbers );
344 $mode can be 'replace', 'add', or 'delete'
346 $cardnumbers and $borrowernumbers are both references to arrays
348 Use either cardnumbers or borrowernumber, but not both.
352 sub ModCourseInstructors {
355 my $course_id = $params{'course_id'};
356 my $mode = $params{'mode'};
357 my $cardnumbers = $params{'cardnumbers'};
358 my $borrowernumbers = $params{'borrowernumbers'};
360 return unless ($course_id);
362 unless ( $mode eq 'replace'
364 || $mode eq 'delete' );
365 return unless ( $cardnumbers || $borrowernumbers );
366 return if ( $cardnumbers && $borrowernumbers );
368 my ( @cardnumbers, @borrowernumbers );
369 @cardnumbers = @$cardnumbers if ( ref($cardnumbers) eq 'ARRAY' );
370 @borrowernumbers = @$borrowernumbers
371 if ( ref($borrowernumbers) eq 'ARRAY' );
373 my $field = (@cardnumbers) ? 'cardnumber' : 'borrowernumber';
374 my @fields = (@cardnumbers) ? @cardnumbers : @borrowernumbers;
375 my $placeholders = join( ',', ('?') x scalar @fields );
377 my $dbh = C4::Context->dbh;
379 $dbh->do( "DELETE FROM course_instructors WHERE course_id = ?", undef, $course_id )
380 if ( $mode eq 'replace' );
384 if ( $mode eq 'add' || $mode eq 'replace' ) {
386 INSERT INTO course_instructors ( course_id, borrowernumber )
387 SELECT ?, borrowernumber
389 WHERE $field IN ( $placeholders )
393 DELETE FROM course_instructors
395 AND borrowernumber IN (
396 SELECT borrowernumber FROM borrowers WHERE $field IN ( $placeholders )
401 my $sth = $dbh->prepare($query);
403 $sth->execute( $course_id, @fields ) if (@fields);
406 =head2 GetCourseItem {
408 Given one of biblionumber, itenumber, or ci_id, returns hashref of the course_items values
410 $course_item = GetCourseItem( itemnumber => $itemnumber [, ci_id => $ci_id ] );
411 $course_item = GetCourseItem( biblionumber => $biblionumber [, ci_id => $ci_id ]);
412 $course_item = GetCourseItem( ci_id => $ci_id );
419 my $ci_id = $params{'ci_id'};
420 my $itemnumber = $params{'itemnumber'};
421 my $biblionumber = $params{'biblionumber'};
423 return unless ( $itemnumber xor $biblionumber xor $ci_id );
425 my ( $field, $value );
427 $field = 'itemnumber';
428 $value = $itemnumber;
429 } elsif ( $biblionumber ) {
430 $field = 'biblionumber';
431 $value = $biblionumber;
437 my $query = "SELECT * FROM course_items WHERE $field = ?";
438 my $dbh = C4::Context->dbh;
439 my $sth = $dbh->prepare($query);
440 $sth->execute($value);
442 my $course_item = $sth->fetchrow_hashref();
445 $query = "SELECT * FROM course_reserves WHERE ci_id = ?";
446 $sth = $dbh->prepare($query);
447 $sth->execute( $course_item->{'ci_id'} );
448 my $course_reserves = $sth->fetchall_arrayref( {} );
450 $course_item->{'course_reserves'} = $course_reserves
451 if ($course_reserves);
456 =head2 ModCourseItem {
458 ModCourseItem( %params );
460 Creates or modifies an existing course item. Must be passed either an itemnumber or biblionumber parameter
467 my $itemnumber = $params{'itemnumber'};
468 my $biblionumber = $params{'biblionumber'};
470 return unless ($itemnumber xor $biblionumber);
472 my $course_item = $itemnumber ? GetCourseItem( itemnumber => $itemnumber ) : GetCourseItem( biblionumber => $biblionumber );
474 if ( $itemnumber and !$biblionumber ) {
475 $biblionumber = Koha::Items->find( $itemnumber )->biblionumber;
476 $params{biblionumber} = $biblionumber;
482 $ci_id = $course_item->{'ci_id'};
486 course_item => $course_item,
490 $ci_id = _AddCourseItem(%params);
497 =head2 _AddCourseItem
499 my $ci_id = _AddCourseItem( %params );
506 $params{homebranch} ||= undef; # Can't be empty string, FK constraint
507 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
509 my %data = map { $_ => $params{$_} } @FIELDS;
510 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
512 my $ci = Koha::Course::Item->new(
514 itemnumber => $params{itemnumber},
515 biblionumber => $params{biblionumber},
524 =head2 _UpdateCourseItem
526 _UpdateCourseItem( %params );
530 sub _UpdateCourseItem {
533 my $ci_id = $params{'ci_id'};
534 my $course_item = $params{'course_item'};
536 $params{homebranch} ||= undef; # Can't be empty string, FK constraint
537 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
539 return unless ( $ci_id || $course_item );
541 $course_item = Koha::Course::Items->find( $ci_id || $course_item->{ci_id} );
543 my %data = map { $_ => $params{$_} } @FIELDS;
544 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
546 if ( $course_item->itemnumber ) {
547 # biblio-level course items don't store any of these fields
548 my $item = Koha::Items->find( $course_item->itemnumber );
550 # Handle updates to changed fields for a course item, both adding and removing
551 if ( $course_item->is_enabled ) {
552 my $item_fields = {};
554 for my $field ( @FIELDS ) {
556 my $field_enabled = $field . '_enabled';
557 my $field_storage = $field . '_storage';
559 # Find newly enabled field and add item value to storage
560 if ( $params{$field_enabled} && !$course_item->$field_enabled ) {
561 $enabled{$field_storage} = $item->$field;
562 $item_fields->{$field} = $params{$field};
564 # Find newly disabled field and copy the storage value to the item, unset storage value
565 elsif ( !$params{$field_enabled} && $course_item->$field_enabled ) {
566 $item_fields->{$field} = $course_item->$field_storage;
567 $enabled{$field_storage} = undef;
569 # The field was already enabled, copy the incoming value to the item.
570 # The "original" ( when not on course reserve ) value is already in the storage field
571 elsif ( $course_item->$field_enabled) {
572 $item_fields->{$field} = $params{$field};
576 $item->set( $item_fields )->store
577 if keys %$item_fields;
581 $course_item->update( { %data, %enabled } );
587 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
589 Copies fields from course item storage back to the actual item
596 my $ci_id = $params{'ci_id'};
598 return unless $ci_id;
600 my $course_item = Koha::Course::Items->find( $ci_id );
602 my $item_fields = {};
603 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
604 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
605 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
606 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
607 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
609 Koha::Items->find( $course_item->itemnumber )
610 ->set( $item_fields )
612 if keys %$item_fields;
614 $course_item->itype_storage(undef);
615 $course_item->ccode_storage(undef);
616 $course_item->location_storage(undef);
617 $course_item->homebranch_storage(undef);
618 $course_item->holdingbranch_storage(undef);
619 $course_item->store();
622 =head2 _SwapAllFields
624 _SwapAllFields( $ci_id );
629 my ( $ci_id, $enabled ) = @_;
631 my $course_item = Koha::Course::Items->find( $ci_id );
632 my $item = Koha::Items->find( $course_item->itemnumber );
634 if ( $enabled eq 'yes' ) { # Copy item fields to course item storage, course item fields to item
635 $course_item->itype_storage( $item->effective_itemtype ) if $course_item->itype_enabled;
636 $course_item->ccode_storage( $item->ccode ) if $course_item->ccode_enabled;
637 $course_item->location_storage( $item->location ) if $course_item->location_enabled;
638 $course_item->homebranch_storage( $item->homebranch ) if $course_item->homebranch_enabled;
639 $course_item->holdingbranch_storage( $item->holdingbranch ) if $course_item->holdingbranch_enabled;
640 $course_item->store();
642 my $item_fields = {};
643 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
644 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
645 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
646 $item_fields->{homebranch} = $course_item->homebranch if $course_item->homebranch_enabled;
647 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
649 Koha::Items->find( $course_item->itemnumber )
650 ->set( $item_fields )
652 if keys %$item_fields;
654 } else { # Copy course item storage to item
655 my $item_fields = {};
656 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
657 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
658 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
659 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
660 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
662 Koha::Items->find( $course_item->itemnumber )
663 ->set( $item_fields )
665 if keys %$item_fields;
667 $course_item->itype_storage(undef);
668 $course_item->ccode_storage(undef);
669 $course_item->location_storage(undef);
670 $course_item->homebranch_storage(undef);
671 $course_item->holdingbranch_storage(undef);
672 $course_item->store();
676 =head2 GetCourseItems {
678 $course_items = GetCourseItems(
679 [course_id => $course_id]
680 [, itemnumber => $itemnumber ]
688 my $course_id = $params{'course_id'};
689 my $itemnumber = $params{'itemnumber'};
691 return unless ($course_id);
696 my $query = "SELECT * FROM course_items";
698 if ( keys %params ) {
702 foreach my $key ( keys %params ) {
703 push( @query_keys, " $key LIKE ? " );
704 push( @query_values, $params{$key} );
707 $query .= join( ' AND ', @query_keys );
710 my $dbh = C4::Context->dbh;
711 my $sth = $dbh->prepare($query);
712 $sth->execute(@query_values);
714 return $sth->fetchall_arrayref( {} );
717 =head2 DelCourseItem {
719 DelCourseItem( ci_id => $cr_id );
726 my $ci_id = $params{'ci_id'};
728 return unless ($ci_id);
730 my $course_item = Koha::Course::Items->find( $ci_id );
731 return unless $course_item;
733 _RevertFields( ci_id => $ci_id ) if $course_item->enabled eq 'yes';
736 DELETE FROM course_items
739 C4::Context->dbh->do( $query, undef, $ci_id );
742 =head2 GetCourseReserve {
744 $course_item = GetCourseReserve( %params );
748 sub GetCourseReserve {
751 my $cr_id = $params{'cr_id'};
752 my $course_id = $params{'course_id'};
753 my $ci_id = $params{'ci_id'};
755 return unless ( $cr_id || ( $course_id && $ci_id ) );
757 my $dbh = C4::Context->dbh;
762 SELECT * FROM course_reserves
765 $sth = $dbh->prepare($query);
766 $sth->execute($cr_id);
769 SELECT * FROM course_reserves
770 WHERE course_id = ? AND ci_id = ?
772 $sth = $dbh->prepare($query);
773 $sth->execute( $course_id, $ci_id );
776 my $course_reserve = $sth->fetchrow_hashref();
777 return $course_reserve;
780 =head2 ModCourseReserve
782 $id = ModCourseReserve( %params );
786 sub ModCourseReserve {
789 my $course_id = $params{'course_id'};
790 my $ci_id = $params{'ci_id'};
791 my $staff_note = $params{'staff_note'};
792 my $public_note = $params{'public_note'};
794 return unless ( $course_id && $ci_id );
796 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
799 my $dbh = C4::Context->dbh;
801 if ($course_reserve) {
802 $cr_id = $course_reserve->{'cr_id'};
805 UPDATE course_reserves
806 SET staff_note = ?, public_note = ?
809 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
812 INSERT INTO course_reserves SET
818 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
819 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
822 EnableOrDisableCourseItem(
823 ci_id => $params{'ci_id'},
829 =head2 GetCourseReserves {
831 $course_reserves = GetCourseReserves( %params );
838 include_courses => 1,
842 sub GetCourseReserves {
845 my $course_id = $params{'course_id'};
846 my $ci_id = $params{'ci_id'};
847 my $include_items = $params{'include_items'};
848 my $include_count = $params{'include_count'};
849 my $include_courses = $params{'include_courses'};
851 return unless ( $course_id || $ci_id );
853 my $field = ($course_id) ? 'course_id' : 'ci_id';
854 my $value = ($course_id) ? $course_id : $ci_id;
857 SELECT cr.*, ci.itemnumber, ci.biblionumber
858 FROM course_reserves cr, course_items ci
860 AND cr.ci_id = ci.ci_id
862 my $dbh = C4::Context->dbh;
863 my $sth = $dbh->prepare($query);
864 $sth->execute($value);
866 my $course_reserves = $sth->fetchall_arrayref( {} );
868 if ($include_items) {
869 foreach my $cr (@$course_reserves) {
870 my $item = Koha::Items->find( $cr->{itemnumber}, { prefetch => ['biblio','biblioitem'] });
871 my $biblio = $cr->{itemnumber} ? $item->biblio : Koha::Biblios->find( $cr->{biblionumber}, { prefetch => ['biblioitem'] });
872 my $biblioitem = $biblio->biblioitem;
873 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
874 $cr->{'item'} = $item;
875 $cr->{'biblio'} = $biblio;
876 $cr->{'biblioitem'} = $biblioitem;
877 $cr->{'issue'} = GetOpenIssue( $cr->{'itemnumber'} );
881 if ($include_count) {
882 foreach my $cr (@$course_reserves) {
883 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
887 if ($include_courses) {
888 foreach my $cr (@$course_reserves) {
889 $cr->{'courses'} = $cr->{itemnumber} ? GetCourses( itemnumber => $cr->{'itemnumber'} ) : GetCourses( biblionumber => $cr->{biblionumber} );
893 return $course_reserves;
896 =head2 DelCourseReserve {
898 DelCourseReserve( cr_id => $cr_id );
902 sub DelCourseReserve {
905 my $cr_id = $params{'cr_id'};
907 return unless ($cr_id);
909 my $dbh = C4::Context->dbh;
911 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
914 DELETE FROM course_reserves
917 $dbh->do( $query, undef, $cr_id );
919 ## If there are no other course reserves for this item
920 ## delete the course_item as well
921 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
922 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
927 =head2 GetItemCourseReservesInfo
929 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
930 my $arrayref = GetItemCourseReservesInfo( biblionumber => $biblionumber );
932 For a given itemnumber or biblionumber, returns an arrayref of reserves hashrefs,
933 with a course hashref under the key 'course'
937 sub GetItemCourseReservesInfo {
940 my $itemnumber = $params{'itemnumber'};
941 my $biblionumber = $params{'biblionumber'};
943 return unless ($itemnumber xor $biblionumber);
945 my $course_item = $itemnumber ? GetCourseItem( itemnumber => $itemnumber ) : GetCourseItem( biblionumber => $biblionumber );
947 return unless ( keys %$course_item );
949 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
951 foreach my $cr (@$course_reserves) {
952 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
955 return $course_reserves;
958 =head2 CountCourseReservesForItem
960 $bool = CountCourseReservesForItem( %params );
962 ci_id - course_item id
964 itemnumber - course_item itemnumber
966 biblionumber - course_item biblionumber
968 enabled = 'yes' or 'no'
969 Optional, if not supplied, counts reserves
970 for both enabled and disabled courses
974 sub CountCourseReservesForItem {
977 my $ci_id = $params{'ci_id'};
978 my $itemnumber = $params{'itemnumber'};
979 my $enabled = $params{'enabled'};
980 my $biblionumber = $params{'biblionumber'};
982 return unless ( $ci_id xor $itemnumber xor $biblionumber );
984 my $course_item = GetCourseItem( ci_id => $ci_id ) || GetCourseItem( itemnumber => $itemnumber ) || GetCourseItem( biblionumber => $biblionumber );
986 my @params = ( $course_item->{'ci_id'} );
987 push( @params, $enabled ) if ($enabled);
990 SELECT COUNT(*) AS count
991 FROM course_reserves cr
992 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
995 $query .= "AND c.enabled = ?" if ($enabled);
997 my $dbh = C4::Context->dbh;
998 my $sth = $dbh->prepare($query);
999 $sth->execute(@params);
1001 my $row = $sth->fetchrow_hashref();
1003 return $row->{'count'};
1006 =head2 SearchCourses
1008 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
1015 my $term = $params{'term'};
1017 my $enabled = $params{'enabled'} || '%';
1021 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
1023 LEFT JOIN course_instructors ci
1024 ON ( c.course_id = ci.course_id )
1025 LEFT JOIN borrowers b
1026 ON ( ci.borrowernumber = b.borrowernumber )
1027 LEFT JOIN authorised_values av
1028 ON ( c.department = av.authorised_value )
1030 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
1033 department LIKE ? OR
1034 course_number LIKE ? OR
1036 course_name LIKE ? OR
1038 public_note LIKE ? OR
1039 CONCAT(surname,' ',firstname) LIKE ? OR
1040 CONCAT(firstname,' ',surname) LIKE ? OR
1046 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
1051 @params = ($term) x 10;
1053 $query .= " ORDER BY department, course_number, section, term, course_name ";
1055 my $dbh = C4::Context->dbh;
1056 my $sth = $dbh->prepare($query);
1058 $sth->execute( @params, $enabled );
1060 my $courses = $sth->fetchall_arrayref( {} );
1062 foreach my $c (@$courses) {
1063 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1069 sub whoami { ( caller(1) )[3] }
1070 sub whowasi { ( caller(2) )[3] }
1072 sub stringify_params {
1077 foreach my $key ( keys %params ) {
1078 $string .= " $key => " . $params{$key} . "\n";
1081 return "( $string )";
1088 Kyle M Hall <kyle@bywatersolutions.com>