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', '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{holdingbranch} ||= undef; # Can't be empty string, FK constraint
500 my %data = map { $_ => $params{$_} } @FIELDS;
501 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
503 my $ci = Koha::Course::Item->new(
505 itemnumber => $params{itemnumber},
514 =head2 _UpdateCourseItem
516 _UpdateCourseItem( %params );
520 sub _UpdateCourseItem {
522 warn identify_myself(%params) if $DEBUG;
524 my $ci_id = $params{'ci_id'};
525 my $course_item = $params{'course_item'};
527 $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint
529 return unless ( $ci_id || $course_item );
531 $course_item = Koha::Course::Items->find( $ci_id || $course_item->{ci_id} );
533 my %data = map { $_ => $params{$_} } @FIELDS;
534 my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS;
536 $course_item->update( { %data, %enabled } );
537 if ( $course_item->is_enabled ) {
538 my $item_fields = {};
539 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
540 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
541 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
542 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
544 Koha::Items->find( $course_item->itemnumber )
545 ->set( $item_fields )
547 if keys %$item_fields;
555 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
557 Copies fields from course item storage back to the actual item
563 warn identify_myself(%params) if $DEBUG;
565 my $ci_id = $params{'ci_id'};
567 return unless $ci_id;
569 my $course_item = Koha::Course::Items->find( $ci_id );
571 my $item_fields = {};
572 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
573 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
574 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
575 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
577 Koha::Items->find( $course_item->itemnumber )
578 ->set( $item_fields )
580 if keys %$item_fields;
582 $course_item->itype_storage(undef);
583 $course_item->ccode_storage(undef);
584 $course_item->location_storage(undef);
585 $course_item->holdingbranch_storage(undef);
586 $course_item->store();
589 =head2 _SwapAllFields
591 _SwapAllFields( $ci_id );
596 my ( $ci_id, $enabled ) = @_;
597 warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG;
599 my $course_item = Koha::Course::Items->find( $ci_id );
600 my $item = Koha::Items->find( $course_item->itemnumber );
602 if ( $enabled eq 'yes' ) { # Copy item fields to course item storage, course item fields to item
603 $course_item->itype_storage( $item->effective_itemtype ) if $course_item->itype_enabled;
604 $course_item->ccode_storage( $item->ccode ) if $course_item->ccode_enabled;
605 $course_item->location_storage( $item->location ) if $course_item->location_enabled;
606 $course_item->holdingbranch_storage( $item->holdingbranch ) if $course_item->holdingbranch_enabled;
607 $course_item->store();
609 my $item_fields = {};
610 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
611 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
612 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
613 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
615 Koha::Items->find( $course_item->itemnumber )
616 ->set( $item_fields )
618 if keys %$item_fields;
620 } else { # Copy course item storage to item
621 my $item_fields = {};
622 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
623 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
624 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
625 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
627 Koha::Items->find( $course_item->itemnumber )
628 ->set( $item_fields )
630 if keys %$item_fields;
632 $course_item->itype_storage(undef);
633 $course_item->ccode_storage(undef);
634 $course_item->location_storage(undef);
635 $course_item->holdingbranch_storage(undef);
636 $course_item->store();
640 =head2 GetCourseItems {
642 $course_items = GetCourseItems(
643 [course_id => $course_id]
644 [, itemnumber => $itemnumber ]
651 warn identify_myself(%params) if $DEBUG;
653 my $course_id = $params{'course_id'};
654 my $itemnumber = $params{'itemnumber'};
656 return unless ($course_id);
661 my $query = "SELECT * FROM course_items";
663 if ( keys %params ) {
667 foreach my $key ( keys %params ) {
668 push( @query_keys, " $key LIKE ? " );
669 push( @query_values, $params{$key} );
672 $query .= join( ' AND ', @query_keys );
675 my $dbh = C4::Context->dbh;
676 my $sth = $dbh->prepare($query);
677 $sth->execute(@query_values);
679 return $sth->fetchall_arrayref( {} );
682 =head2 DelCourseItem {
684 DelCourseItem( ci_id => $cr_id );
690 warn identify_myself(%params) if $DEBUG;
692 my $ci_id = $params{'ci_id'};
694 return unless ($ci_id);
696 _RevertFields( ci_id => $ci_id );
699 DELETE FROM course_items
702 C4::Context->dbh->do( $query, undef, $ci_id );
705 =head2 GetCourseReserve {
707 $course_item = GetCourseReserve( %params );
711 sub GetCourseReserve {
713 warn identify_myself(%params) if $DEBUG;
715 my $cr_id = $params{'cr_id'};
716 my $course_id = $params{'course_id'};
717 my $ci_id = $params{'ci_id'};
719 return unless ( $cr_id || ( $course_id && $ci_id ) );
721 my $dbh = C4::Context->dbh;
726 SELECT * FROM course_reserves
729 $sth = $dbh->prepare($query);
730 $sth->execute($cr_id);
733 SELECT * FROM course_reserves
734 WHERE course_id = ? AND ci_id = ?
736 $sth = $dbh->prepare($query);
737 $sth->execute( $course_id, $ci_id );
740 my $course_reserve = $sth->fetchrow_hashref();
741 return $course_reserve;
744 =head2 ModCourseReserve
746 $id = ModCourseReserve( %params );
750 sub ModCourseReserve {
752 warn identify_myself(%params) if $DEBUG;
754 my $course_id = $params{'course_id'};
755 my $ci_id = $params{'ci_id'};
756 my $staff_note = $params{'staff_note'};
757 my $public_note = $params{'public_note'};
759 return unless ( $course_id && $ci_id );
761 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
764 my $dbh = C4::Context->dbh;
766 if ($course_reserve) {
767 $cr_id = $course_reserve->{'cr_id'};
770 UPDATE course_reserves
771 SET staff_note = ?, public_note = ?
774 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
777 INSERT INTO course_reserves SET
783 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
784 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
787 EnableOrDisableCourseItem(
788 ci_id => $params{'ci_id'},
794 =head2 GetCourseReserves {
796 $course_reserves = GetCourseReserves( %params );
803 include_courses => 1,
807 sub GetCourseReserves {
809 warn identify_myself(%params) if $DEBUG;
811 my $course_id = $params{'course_id'};
812 my $ci_id = $params{'ci_id'};
813 my $include_items = $params{'include_items'};
814 my $include_count = $params{'include_count'};
815 my $include_courses = $params{'include_courses'};
817 return unless ( $course_id || $ci_id );
819 my $field = ($course_id) ? 'course_id' : 'ci_id';
820 my $value = ($course_id) ? $course_id : $ci_id;
823 SELECT cr.*, ci.itemnumber
824 FROM course_reserves cr, course_items ci
826 AND cr.ci_id = ci.ci_id
828 my $dbh = C4::Context->dbh;
829 my $sth = $dbh->prepare($query);
830 $sth->execute($value);
832 my $course_reserves = $sth->fetchall_arrayref( {} );
834 if ($include_items) {
835 foreach my $cr (@$course_reserves) {
836 my $item = Koha::Items->find( $cr->{itemnumber} );
837 my $biblio = $item->biblio;
838 my $biblioitem = $biblio->biblioitem;
839 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
840 $cr->{'item'} = $item;
841 $cr->{'biblio'} = $biblio;
842 $cr->{'biblioitem'} = $biblioitem;
843 $cr->{'issue'} = GetOpenIssue( $cr->{'itemnumber'} );
847 if ($include_count) {
848 foreach my $cr (@$course_reserves) {
849 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
853 if ($include_courses) {
854 foreach my $cr (@$course_reserves) {
855 $cr->{'courses'} = GetCourses( itemnumber => $cr->{'itemnumber'} );
859 return $course_reserves;
862 =head2 DelCourseReserve {
864 DelCourseReserve( cr_id => $cr_id );
868 sub DelCourseReserve {
870 warn identify_myself(%params) if $DEBUG;
872 my $cr_id = $params{'cr_id'};
874 return unless ($cr_id);
876 my $dbh = C4::Context->dbh;
878 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
881 DELETE FROM course_reserves
884 $dbh->do( $query, undef, $cr_id );
886 ## If there are no other course reserves for this item
887 ## delete the course_item as well
888 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
889 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
894 =head2 GetItemCourseReservesInfo
896 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
898 For a given item, returns an arrayref of reserves hashrefs,
899 with a course hashref under the key 'course'
903 sub GetItemCourseReservesInfo {
905 warn identify_myself(%params) if $DEBUG;
907 my $itemnumber = $params{'itemnumber'};
909 return unless ($itemnumber);
911 my $course_item = GetCourseItem( itemnumber => $itemnumber );
913 return unless ( keys %$course_item );
915 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
917 foreach my $cr (@$course_reserves) {
918 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
921 return $course_reserves;
924 =head2 CountCourseReservesForItem
926 $bool = CountCourseReservesForItem( %params );
928 ci_id - course_item id
930 itemnumber - course_item itemnumber
932 enabled = 'yes' or 'no'
933 Optional, if not supplied, counts reserves
934 for both enabled and disabled courses
938 sub CountCourseReservesForItem {
940 warn identify_myself(%params) if $DEBUG;
942 my $ci_id = $params{'ci_id'};
943 my $itemnumber = $params{'itemnumber'};
944 my $enabled = $params{'enabled'};
946 return unless ( $ci_id || $itemnumber );
948 my $course_item = GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber );
950 my @params = ( $course_item->{'ci_id'} );
951 push( @params, $enabled ) if ($enabled);
954 SELECT COUNT(*) AS count
955 FROM course_reserves cr
956 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
959 $query .= "AND c.enabled = ?" if ($enabled);
961 my $dbh = C4::Context->dbh;
962 my $sth = $dbh->prepare($query);
963 $sth->execute(@params);
965 my $row = $sth->fetchrow_hashref();
967 return $row->{'count'};
972 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
978 warn identify_myself(%params) if $DEBUG;
980 my $term = $params{'term'};
982 my $enabled = $params{'enabled'} || '%';
986 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
988 LEFT JOIN course_instructors ci
989 ON ( c.course_id = ci.course_id )
990 LEFT JOIN borrowers b
991 ON ( ci.borrowernumber = b.borrowernumber )
992 LEFT JOIN authorised_values av
993 ON ( c.department = av.authorised_value )
995 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
999 course_number LIKE ? OR
1001 course_name LIKE ? OR
1003 public_note LIKE ? OR
1004 CONCAT(surname,' ',firstname) LIKE ? OR
1005 CONCAT(firstname,' ',surname) LIKE ? OR
1011 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
1016 @params = ($term) x 10;
1018 $query .= " ORDER BY department, course_number, section, term, course_name ";
1020 my $dbh = C4::Context->dbh;
1021 my $sth = $dbh->prepare($query);
1023 $sth->execute( @params, $enabled );
1025 my $courses = $sth->fetchall_arrayref( {} );
1027 foreach my $c (@$courses) {
1028 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1034 sub whoami { ( caller(1) )[3] }
1035 sub whowasi { ( caller(2) )[3] }
1037 sub stringify_params {
1042 foreach my $key ( keys %params ) {
1043 $string .= " $key => " . $params{$key} . "\n";
1046 return "( $string )";
1049 sub identify_myself {
1052 return whowasi() . stringify_params(%params);
1059 Kyle M Hall <kyle@bywatersolutions.com>