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 );
25 use Koha::Course::Instructors;
26 use Koha::Course::Items;
27 use Koha::Course::Reserves;
31 our (@ISA, @EXPORT_OK);
54 GetItemCourseReservesInfo
57 @FIELDS = ( 'itype', 'ccode', 'homebranch', 'holdingbranch', 'location' );
62 C4::CourseReserves - Koha course reserves module
66 use C4::CourseReserves;
70 This module deals with course reserves.
76 $course = GetCourse( $course_id );
83 my $course = Koha::Courses->find( $course_id );
84 return unless $course;
85 $course = $course->unblessed;
87 my $dbh = C4::Context->dbh;
89 SELECT b.* FROM course_instructors ci
90 LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber )
93 my $sth = $dbh->prepare($query);
94 $sth->execute($course_id);
95 $course->{'instructors'} = $sth->fetchall_arrayref( {} );
102 ModCourse( [ course_id => $id ] [, course_name => $course_name ] [etc...] );
109 my $dbh = C4::Context->dbh;
112 if ( defined $params{'course_id'} ) {
113 $course_id = $params{'course_id'};
114 delete $params{'course_id'};
122 $query .= ($course_id) ? ' UPDATE ' : ' INSERT ';
123 $query .= ' courses SET ';
125 foreach my $key ( keys %params ) {
126 push( @query_keys, "$key=?" );
127 push( @query_values, $params{$key} );
129 $query .= join( ',', @query_keys );
132 $query .= " WHERE course_id = ?";
133 push( @query_values, $course_id );
136 $dbh->do( $query, undef, @query_values );
138 $course_id = $course_id
139 || $dbh->last_insert_id( undef, undef, 'courses', 'course_id' );
141 EnableOrDisableCourseItems(
142 course_id => $course_id,
143 enabled => $params{'enabled'}
151 @courses = GetCourses( [ fieldname => $value ] [, fieldname2 => $value2 ] [etc...] );
162 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
164 LEFT JOIN course_reserves ON course_reserves.course_id = c.course_id
165 LEFT JOIN course_items ON course_items.ci_id = course_reserves.ci_id
168 if ( keys %params ) {
172 foreach my $key ( keys %params ) {
173 push( @query_keys, " $key LIKE ? " );
174 push( @query_values, $params{$key} );
177 $query .= join( ' AND ', @query_keys );
180 $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 ";
182 my $dbh = C4::Context->dbh;
183 my $sth = $dbh->prepare($query);
184 $sth->execute(@query_values);
186 my $courses = $sth->fetchall_arrayref( {} );
188 foreach my $c (@$courses) {
189 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
197 DelCourse( $course_id );
202 my ($course_id) = @_;
204 my $course_reserves = GetCourseReserves( course_id => $course_id );
206 foreach my $res (@$course_reserves) {
207 DelCourseReserve( cr_id => $res->{'cr_id'} );
211 DELETE FROM course_instructors
214 C4::Context->dbh->do( $query, undef, $course_id );
220 C4::Context->dbh->do( $query, undef, $course_id );
223 =head2 EnableOrDisableCourseItems
225 EnableOrDisableCourseItems( course_id => $course_id, enabled => $enabled );
227 For each item on reserve for this course,
228 if the course item has no active course reserves,
229 swap the fields for the item to make it 'normal'
232 enabled => 'yes' to enable course items
233 enabled => 'no' to disable course items
237 sub EnableOrDisableCourseItems {
240 my $course_id = $params{'course_id'};
241 my $enabled = $params{'enabled'} || 0;
243 my $lookfor = ( $enabled eq 'yes' ) ? 'no' : 'yes';
245 return unless ( $course_id && $enabled );
246 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
248 my $course_reserves = GetCourseReserves( course_id => $course_id );
250 if ( $enabled eq 'yes' ) {
251 foreach my $course_reserve (@$course_reserves) {
252 if (CountCourseReservesForItem(
253 ci_id => $course_reserve->{'ci_id'},
257 EnableOrDisableCourseItem(
258 ci_id => $course_reserve->{'ci_id'},
263 if ( $enabled eq 'no' ) {
264 foreach my $course_reserve (@$course_reserves) {
266 CountCourseReservesForItem(
267 ci_id => $course_reserve->{'ci_id'},
271 EnableOrDisableCourseItem(
272 ci_id => $course_reserve->{'ci_id'},
279 =head2 EnableOrDisableCourseItem
281 EnableOrDisableCourseItem( ci_id => $ci_id );
285 sub EnableOrDisableCourseItem {
288 my $ci_id = $params{'ci_id'};
290 return unless ( $ci_id );
292 my $course_item = GetCourseItem( ci_id => $ci_id );
294 my $info = $course_item->{itemnumber} ? GetItemCourseReservesInfo( itemnumber => $course_item->{itemnumber} ) : GetItemCourseReservesInfo( biblionumber => $course_item->{biblionumber} );
296 my $enabled = any { $_->{course}->{enabled} eq 'yes' } @$info;
297 $enabled = $enabled ? 'yes' : 'no';
299 ## We don't want to 'enable' an already enabled item,
300 ## or disable and already disabled item,
301 ## as that would cause the fields to swap
302 if ( $course_item->{'enabled'} ne $enabled ) {
303 _SwapAllFields($ci_id, $enabled );
311 C4::Context->dbh->do( $query, undef, $enabled, $ci_id );
317 =head2 GetCourseInstructors
319 @$borrowers = GetCourseInstructors( $course_id );
323 sub GetCourseInstructors {
324 my ($course_id) = @_;
327 SELECT * FROM borrowers
328 RIGHT JOIN course_instructors ON ( course_instructors.borrowernumber = borrowers.borrowernumber )
329 WHERE course_instructors.course_id = ?
332 my $dbh = C4::Context->dbh;
333 my $sth = $dbh->prepare($query);
334 $sth->execute($course_id);
336 return $sth->fetchall_arrayref( {} );
339 =head2 ModCourseInstructors
341 ModCourseInstructors( mode => $mode, course_id => $course_id, [ cardnumbers => $cardnumbers ] OR [ borrowernumbers => $borrowernumbers );
343 $mode can be 'replace', 'add', or 'delete'
345 $cardnumbers and $borrowernumbers are both references to arrays
347 Use either cardnumbers or borrowernumber, but not both.
351 sub ModCourseInstructors {
354 my $course_id = $params{'course_id'};
355 my $mode = $params{'mode'};
356 my $cardnumbers = $params{'cardnumbers'};
357 my $borrowernumbers = $params{'borrowernumbers'};
359 return unless ($course_id);
361 unless ( $mode eq 'replace'
363 || $mode eq 'delete' );
364 return unless ( $cardnumbers || $borrowernumbers );
365 return if ( $cardnumbers && $borrowernumbers );
367 my ( @cardnumbers, @borrowernumbers );
368 @cardnumbers = @$cardnumbers if ( ref($cardnumbers) eq 'ARRAY' );
369 @borrowernumbers = @$borrowernumbers
370 if ( ref($borrowernumbers) eq 'ARRAY' );
372 my $field = (@cardnumbers) ? 'cardnumber' : 'borrowernumber';
373 my @fields = (@cardnumbers) ? @cardnumbers : @borrowernumbers;
374 my $placeholders = join( ',', ('?') x scalar @fields );
376 my $dbh = C4::Context->dbh;
378 $dbh->do( "DELETE FROM course_instructors WHERE course_id = ?", undef, $course_id )
379 if ( $mode eq 'replace' );
383 if ( $mode eq 'add' || $mode eq 'replace' ) {
385 INSERT INTO course_instructors ( course_id, borrowernumber )
386 SELECT ?, borrowernumber
388 WHERE $field IN ( $placeholders )
392 DELETE FROM course_instructors
394 AND borrowernumber IN (
395 SELECT borrowernumber FROM borrowers WHERE $field IN ( $placeholders )
400 my $sth = $dbh->prepare($query);
402 $sth->execute( $course_id, @fields ) if (@fields);
405 =head2 GetCourseItem {
407 Given one of biblionumber, itenumber, or ci_id, returns hashref of the course_items values
409 $course_item = GetCourseItem( itemnumber => $itemnumber [, ci_id => $ci_id ] );
410 $course_item = GetCourseItem( biblionumber => $biblionumber [, ci_id => $ci_id ]);
411 $course_item = GetCourseItem( ci_id => $ci_id );
418 my $ci_id = $params{'ci_id'};
419 my $itemnumber = $params{'itemnumber'};
420 my $biblionumber = $params{'biblionumber'};
422 return unless ( $itemnumber xor $biblionumber xor $ci_id );
424 my ( $field, $value );
426 $field = 'itemnumber';
427 $value = $itemnumber;
428 } elsif ( $biblionumber ) {
429 $field = 'biblionumber';
430 $value = $biblionumber;
436 my $query = "SELECT * FROM course_items WHERE $field = ?";
437 my $dbh = C4::Context->dbh;
438 my $sth = $dbh->prepare($query);
439 $sth->execute($value);
441 my $course_item = $sth->fetchrow_hashref();
444 $query = "SELECT * FROM course_reserves WHERE ci_id = ?";
445 $sth = $dbh->prepare($query);
446 $sth->execute( $course_item->{'ci_id'} );
447 my $course_reserves = $sth->fetchall_arrayref( {} );
449 $course_item->{'course_reserves'} = $course_reserves
450 if ($course_reserves);
455 =head2 ModCourseItem {
457 ModCourseItem( %params );
459 Creates or modifies an existing course item. Must be passed either an itemnumber or biblionumber parameter
466 my $itemnumber = $params{'itemnumber'};
467 my $biblionumber = $params{'biblionumber'};
469 return unless ($itemnumber xor $biblionumber);
471 my $course_item = $itemnumber ? GetCourseItem( itemnumber => $itemnumber ) : GetCourseItem( biblionumber => $biblionumber );
473 if ( $itemnumber and !$biblionumber ) {
474 $biblionumber = Koha::Items->find( $itemnumber )->biblionumber;
475 $params{biblionumber} = $biblionumber;
481 $ci_id = $course_item->{'ci_id'};
485 course_item => $course_item,
489 $ci_id = _AddCourseItem(%params);
496 =head2 _AddCourseItem
498 my $ci_id = _AddCourseItem( %params );
505 $params{homebranch} ||= undef; # Can't be empty string, FK constraint
506 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
508 my %data = map { $_ => $params{$_} } @FIELDS;
509 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
511 my $ci = Koha::Course::Item->new(
513 itemnumber => $params{itemnumber},
514 biblionumber => $params{biblionumber},
523 =head2 _UpdateCourseItem
525 _UpdateCourseItem( %params );
529 sub _UpdateCourseItem {
532 my $ci_id = $params{'ci_id'};
533 my $course_item = $params{'course_item'};
535 $params{homebranch} ||= undef; # Can't be empty string, FK constraint
536 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
538 return unless ( $ci_id || $course_item );
540 $course_item = Koha::Course::Items->find( $ci_id || $course_item->{ci_id} );
542 my %data = map { $_ => $params{$_} } @FIELDS;
543 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
545 if ( $course_item->itemnumber ) {
546 # biblio-level course items don't store any of these fields
547 my $item = Koha::Items->find( $course_item->itemnumber );
549 # Handle updates to changed fields for a course item, both adding and removing
550 if ( $course_item->is_enabled ) {
551 my $item_fields = {};
553 for my $field ( @FIELDS ) {
555 my $field_enabled = $field . '_enabled';
556 my $field_storage = $field . '_storage';
558 # Find newly enabled field and add item value to storage
559 if ( $params{$field_enabled} && !$course_item->$field_enabled ) {
560 $enabled{$field_storage} = $item->$field;
561 $item_fields->{$field} = $params{$field};
563 # Find newly disabled field and copy the storage value to the item, unset storage value
564 elsif ( !$params{$field_enabled} && $course_item->$field_enabled ) {
565 $item_fields->{$field} = $course_item->$field_storage;
566 $enabled{$field_storage} = undef;
568 # The field was already enabled, copy the incoming value to the item.
569 # The "original" ( when not on course reserve ) value is already in the storage field
570 elsif ( $course_item->$field_enabled) {
571 $item_fields->{$field} = $params{$field};
575 $item->set( $item_fields )->store
576 if keys %$item_fields;
580 $course_item->update( { %data, %enabled } );
586 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
588 Copies fields from course item storage back to the actual item
595 my $ci_id = $params{'ci_id'};
597 return unless $ci_id;
599 my $course_item = Koha::Course::Items->find( $ci_id );
601 my $item_fields = {};
602 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
603 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
604 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
605 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
606 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
608 Koha::Items->find( $course_item->itemnumber )
609 ->set( $item_fields )
611 if keys %$item_fields;
613 $course_item->itype_storage(undef);
614 $course_item->ccode_storage(undef);
615 $course_item->location_storage(undef);
616 $course_item->homebranch_storage(undef);
617 $course_item->holdingbranch_storage(undef);
618 $course_item->store();
621 =head2 _SwapAllFields
623 _SwapAllFields( $ci_id );
628 my ( $ci_id, $enabled ) = @_;
630 my $course_item = Koha::Course::Items->find( $ci_id );
631 my $item = Koha::Items->find( $course_item->itemnumber );
633 if ( $enabled eq 'yes' ) { # Copy item fields to course item storage, course item fields to item
634 $course_item->itype_storage( $item->effective_itemtype ) if $course_item->itype_enabled;
635 $course_item->ccode_storage( $item->ccode ) if $course_item->ccode_enabled;
636 $course_item->location_storage( $item->location ) if $course_item->location_enabled;
637 $course_item->homebranch_storage( $item->homebranch ) if $course_item->homebranch_enabled;
638 $course_item->holdingbranch_storage( $item->holdingbranch ) if $course_item->holdingbranch_enabled;
639 $course_item->store();
641 my $item_fields = {};
642 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
643 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
644 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
645 $item_fields->{homebranch} = $course_item->homebranch if $course_item->homebranch_enabled;
646 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
648 Koha::Items->find( $course_item->itemnumber )
649 ->set( $item_fields )
651 if keys %$item_fields;
653 } else { # Copy course item storage to item
654 my $item_fields = {};
655 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
656 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
657 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
658 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
659 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
661 Koha::Items->find( $course_item->itemnumber )
662 ->set( $item_fields )
664 if keys %$item_fields;
666 $course_item->itype_storage(undef);
667 $course_item->ccode_storage(undef);
668 $course_item->location_storage(undef);
669 $course_item->homebranch_storage(undef);
670 $course_item->holdingbranch_storage(undef);
671 $course_item->store();
675 =head2 GetCourseItems {
677 $course_items = GetCourseItems(
678 [course_id => $course_id]
679 [, itemnumber => $itemnumber ]
687 my $course_id = $params{'course_id'};
688 my $itemnumber = $params{'itemnumber'};
690 return unless ($course_id);
695 my $query = "SELECT * FROM course_items";
697 if ( keys %params ) {
701 foreach my $key ( keys %params ) {
702 push( @query_keys, " $key LIKE ? " );
703 push( @query_values, $params{$key} );
706 $query .= join( ' AND ', @query_keys );
709 my $dbh = C4::Context->dbh;
710 my $sth = $dbh->prepare($query);
711 $sth->execute(@query_values);
713 return $sth->fetchall_arrayref( {} );
716 =head2 DelCourseItem {
718 DelCourseItem( ci_id => $cr_id );
725 my $ci_id = $params{'ci_id'};
727 return unless ($ci_id);
729 my $course_item = Koha::Course::Items->find( $ci_id );
730 return unless $course_item;
732 _RevertFields( ci_id => $ci_id ) if $course_item->enabled eq 'yes';
735 DELETE FROM course_items
738 C4::Context->dbh->do( $query, undef, $ci_id );
741 =head2 GetCourseReserve {
743 $course_item = GetCourseReserve( %params );
747 sub GetCourseReserve {
750 my $cr_id = $params{'cr_id'};
751 my $course_id = $params{'course_id'};
752 my $ci_id = $params{'ci_id'};
754 return unless ( $cr_id || ( $course_id && $ci_id ) );
756 my $dbh = C4::Context->dbh;
761 SELECT * FROM course_reserves
764 $sth = $dbh->prepare($query);
765 $sth->execute($cr_id);
768 SELECT * FROM course_reserves
769 WHERE course_id = ? AND ci_id = ?
771 $sth = $dbh->prepare($query);
772 $sth->execute( $course_id, $ci_id );
775 my $course_reserve = $sth->fetchrow_hashref();
776 return $course_reserve;
779 =head2 ModCourseReserve
781 $id = ModCourseReserve( %params );
785 sub ModCourseReserve {
788 my $course_id = $params{'course_id'};
789 my $ci_id = $params{'ci_id'};
790 my $staff_note = $params{'staff_note'};
791 my $public_note = $params{'public_note'};
793 return unless ( $course_id && $ci_id );
795 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
798 my $dbh = C4::Context->dbh;
800 if ($course_reserve) {
801 $cr_id = $course_reserve->{'cr_id'};
804 UPDATE course_reserves
805 SET staff_note = ?, public_note = ?
808 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
811 INSERT INTO course_reserves SET
817 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
818 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
821 EnableOrDisableCourseItem(
822 ci_id => $params{'ci_id'},
828 =head2 GetCourseReserves {
830 $course_reserves = GetCourseReserves( %params );
837 include_courses => 1,
841 sub GetCourseReserves {
844 my $course_id = $params{'course_id'};
845 my $ci_id = $params{'ci_id'};
846 my $include_items = $params{'include_items'};
847 my $include_count = $params{'include_count'};
848 my $include_courses = $params{'include_courses'};
850 return unless ( $course_id || $ci_id );
852 my $field = ($course_id) ? 'course_id' : 'ci_id';
853 my $value = ($course_id) ? $course_id : $ci_id;
856 SELECT cr.*, ci.itemnumber, ci.biblionumber
857 FROM course_reserves cr, course_items ci
859 AND cr.ci_id = ci.ci_id
861 my $dbh = C4::Context->dbh;
862 my $sth = $dbh->prepare($query);
863 $sth->execute($value);
865 my $course_reserves = $sth->fetchall_arrayref( {} );
867 if ($include_items) {
868 foreach my $cr (@$course_reserves) {
869 my $item = Koha::Items->find( $cr->{itemnumber}, { prefetch => ['biblio','biblioitem'] });
870 my $biblio = $cr->{itemnumber} ? $item->biblio : Koha::Biblios->find( $cr->{biblionumber}, { prefetch => ['biblioitem'] });
871 my $biblioitem = $biblio->biblioitem;
872 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
873 $cr->{'item'} = $item;
874 $cr->{'biblio'} = $biblio;
875 $cr->{'biblioitem'} = $biblioitem;
876 $cr->{'issue'} = Koha::Checkouts->find({ itemnumber => $cr->{'itemnumber'} });
880 if ($include_count) {
881 foreach my $cr (@$course_reserves) {
882 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
886 if ($include_courses) {
887 foreach my $cr (@$course_reserves) {
888 $cr->{'courses'} = $cr->{itemnumber} ? GetCourses( itemnumber => $cr->{'itemnumber'} ) : GetCourses( biblionumber => $cr->{biblionumber} );
892 return $course_reserves;
895 =head2 DelCourseReserve {
897 DelCourseReserve( cr_id => $cr_id );
901 sub DelCourseReserve {
904 my $cr_id = $params{'cr_id'};
906 return unless ($cr_id);
908 my $dbh = C4::Context->dbh;
910 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
913 DELETE FROM course_reserves
916 $dbh->do( $query, undef, $cr_id );
918 ## If there are no other course reserves for this item
919 ## delete the course_item as well
920 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
921 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
926 =head2 GetItemCourseReservesInfo
928 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
929 my $arrayref = GetItemCourseReservesInfo( biblionumber => $biblionumber );
931 For a given itemnumber or biblionumber, returns an arrayref of reserves hashrefs,
932 with a course hashref under the key 'course'
936 sub GetItemCourseReservesInfo {
939 my $itemnumber = $params{'itemnumber'};
940 my $biblionumber = $params{'biblionumber'};
942 return unless ($itemnumber xor $biblionumber);
944 my $course_item = $itemnumber ? GetCourseItem( itemnumber => $itemnumber ) : GetCourseItem( biblionumber => $biblionumber );
946 return unless ( keys %$course_item );
948 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
950 foreach my $cr (@$course_reserves) {
951 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
954 return $course_reserves;
957 =head2 CountCourseReservesForItem
959 $bool = CountCourseReservesForItem( %params );
961 ci_id - course_item id
963 itemnumber - course_item itemnumber
965 biblionumber - course_item biblionumber
967 enabled = 'yes' or 'no'
968 Optional, if not supplied, counts reserves
969 for both enabled and disabled courses
973 sub CountCourseReservesForItem {
976 my $ci_id = $params{'ci_id'};
977 my $itemnumber = $params{'itemnumber'};
978 my $enabled = $params{'enabled'};
979 my $biblionumber = $params{'biblionumber'};
981 return unless ( $ci_id xor $itemnumber xor $biblionumber );
983 my $course_item = GetCourseItem( ci_id => $ci_id ) || GetCourseItem( itemnumber => $itemnumber ) || GetCourseItem( biblionumber => $biblionumber );
985 my @params = ( $course_item->{'ci_id'} );
986 push( @params, $enabled ) if ($enabled);
989 SELECT COUNT(*) AS count
990 FROM course_reserves cr
991 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
994 $query .= "AND c.enabled = ?" if ($enabled);
996 my $dbh = C4::Context->dbh;
997 my $sth = $dbh->prepare($query);
998 $sth->execute(@params);
1000 my $row = $sth->fetchrow_hashref();
1002 return $row->{'count'};
1005 =head2 SearchCourses
1007 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
1014 my $term = $params{'term'};
1016 my $enabled = $params{'enabled'} || '%';
1020 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
1022 LEFT JOIN course_instructors ci
1023 ON ( c.course_id = ci.course_id )
1024 LEFT JOIN borrowers b
1025 ON ( ci.borrowernumber = b.borrowernumber )
1026 LEFT JOIN authorised_values av
1027 ON ( c.department = av.authorised_value )
1029 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
1032 department LIKE ? OR
1033 course_number LIKE ? OR
1035 course_name LIKE ? OR
1037 public_note LIKE ? OR
1038 CONCAT(surname,' ',firstname) LIKE ? OR
1039 CONCAT(firstname,' ',surname) LIKE ? OR
1045 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
1050 @params = ($term) x 10;
1052 $query .= " ORDER BY department, course_number, section, term, course_name ";
1054 my $dbh = C4::Context->dbh;
1055 my $sth = $dbh->prepare($query);
1057 $sth->execute( @params, $enabled );
1059 my $courses = $sth->fetchall_arrayref( {} );
1061 foreach my $c (@$courses) {
1062 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1068 sub whoami { ( caller(1) )[3] }
1069 sub whowasi { ( caller(2) )[3] }
1071 sub stringify_params {
1076 foreach my $key ( keys %params ) {
1077 $string .= " $key => " . $params{$key} . "\n";
1080 return "( $string )";
1087 Kyle M Hall <kyle@bywatersolutions.com>