1 package C4
::CourseReserves
;
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 2 of the License, or (at your option) any later
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along with
15 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
16 # Suite 330, Boston, MA 02111-1307 USA
21 use C4
::Items
qw(GetItem ModItem);
22 use C4
::Biblio
qw(GetBiblioFromItemNumber);
23 use C4
::Circulation
qw(GetOpenIssue);
25 use vars
qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG @FIELDS);
49 &GetItemCourseReservesInfo
51 %EXPORT_TAGS = ( 'all' => \
@EXPORT_OK );
54 @FIELDS = ( 'itype', 'ccode', 'holdingbranch', 'location' );
59 C4::CourseReserves - Koha course reserves module
63 use C4::CourseReserves;
67 This module deals with course reserves.
73 $course = GetCourse( $course_id );
79 warn whoami
() . "( $course_id )" if $DEBUG;
81 my $query = "SELECT * FROM courses WHERE course_id = ?";
82 my $dbh = C4
::Context
->dbh;
83 my $sth = $dbh->prepare($query);
84 $sth->execute($course_id);
86 my $course = $sth->fetchrow_hashref();
89 SELECT b.* FROM course_instructors ci
90 LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber )
93 $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...] );
108 warn identify_myself
(%params) if $DEBUG;
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...] );
158 warn identify_myself
(%params) if $DEBUG;
166 LEFT JOIN course_reserves ON course_reserves.course_id = courses.course_id
167 LEFT JOIN course_items ON course_items.ci_id = course_reserves.ci_id
170 if ( keys %params ) {
174 foreach my $key ( keys %params ) {
175 push( @query_keys, " $key LIKE ? " );
176 push( @query_values, $params{$key} );
179 $query .= join( ' AND ', @query_keys );
182 $query .= " GROUP BY courses.course_id ";
184 my $dbh = C4
::Context
->dbh;
185 my $sth = $dbh->prepare($query);
186 $sth->execute(@query_values);
188 my $courses = $sth->fetchall_arrayref( {} );
190 foreach my $c (@
$courses) {
191 $c->{'instructors'} = GetCourseInstructors
( $c->{'course_id'} );
199 DelCourse( $course_id );
204 my ($course_id) = @_;
206 my $course_reserves = GetCourseReserves
( course_id
=> $course_id );
208 foreach my $res (@
$course_reserves) {
209 DelCourseReserve
( cr_id
=> $res->{'cr_id'} );
213 DELETE FROM course_instructors
216 C4
::Context
->dbh->do( $query, undef, $course_id );
222 C4
::Context
->dbh->do( $query, undef, $course_id );
225 =head2 EnableOrDisableCourseItems
227 EnableOrDisableCourseItems( course_id => $course_id, enabled => $enabled );
229 For each item on reserve for this course,
230 if the course item has no active course reserves,
231 swap the fields for the item to make it 'normal'
234 enabled => 'yes' to enable course items
235 enabled => 'no' to disable course items
239 sub EnableOrDisableCourseItems
{
241 warn identify_myself
(%params) if $DEBUG;
243 my $course_id = $params{'course_id'};
244 my $enabled = $params{'enabled'} || 0;
246 my $lookfor = ( $enabled eq 'yes' ) ?
'no' : 'yes';
248 return unless ( $course_id && $enabled );
249 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
251 my $course_reserves = GetCourseReserves
( course_id
=> $course_id );
253 if ( $enabled eq 'yes' ) {
254 foreach my $course_reserve (@
$course_reserves) {
255 if (CountCourseReservesForItem
(
256 ci_id
=> $course_reserve->{'ci_id'},
260 EnableOrDisableCourseItem
(
261 ci_id
=> $course_reserve->{'ci_id'},
267 if ( $enabled eq 'no' ) {
268 foreach my $course_reserve (@
$course_reserves) {
270 CountCourseReservesForItem
(
271 ci_id
=> $course_reserve->{'ci_id'},
275 EnableOrDisableCourseItem
(
276 ci_id
=> $course_reserve->{'ci_id'},
284 =head2 EnableOrDisableCourseItem
286 EnableOrDisableCourseItem( ci_id => $ci_id, enabled => $enabled );
288 enabled => 'yes' to enable course items
289 enabled => 'no' to disable course items
293 sub EnableOrDisableCourseItem
{
295 warn identify_myself
(%params) if $DEBUG;
297 my $ci_id = $params{'ci_id'};
298 my $enabled = $params{'enabled'};
300 return unless ( $ci_id && $enabled );
301 return unless ( $enabled eq 'yes' || $enabled eq 'no' );
303 my $course_item = GetCourseItem
( ci_id
=> $ci_id );
305 ## We don't want to 'enable' an already enabled item,
306 ## or disable and already disabled item,
307 ## as that would cause the fields to swap
308 if ( $course_item->{'enabled'} ne $enabled ) {
309 _SwapAllFields
($ci_id);
317 C4
::Context
->dbh->do( $query, undef, $enabled, $ci_id );
323 =head2 GetCourseInstructors
325 @$borrowers = GetCourseInstructors( $course_id );
329 sub GetCourseInstructors
{
330 my ($course_id) = @_;
331 warn "C4::CourseReserves::GetCourseInstructors( $course_id )"
335 SELECT * FROM borrowers
336 RIGHT JOIN course_instructors ON ( course_instructors.borrowernumber = borrowers.borrowernumber )
337 WHERE course_instructors.course_id = ?
340 my $dbh = C4
::Context
->dbh;
341 my $sth = $dbh->prepare($query);
342 $sth->execute($course_id);
344 return $sth->fetchall_arrayref( {} );
347 =head2 ModCourseInstructors
349 ModCourseInstructors( mode => $mode, course_id => $course_id, [ cardnumbers => $cardnumbers ] OR [ borrowernumbers => $borrowernumbers );
351 $mode can be 'replace', 'add', or 'delete'
353 $cardnumbers and $borrowernumbers are both references to arrays
355 Use either cardnumbers or borrowernumber, but not both.
359 sub ModCourseInstructors
{
361 warn identify_myself
(%params) if $DEBUG;
363 my $course_id = $params{'course_id'};
364 my $mode = $params{'mode'};
365 my $cardnumbers = $params{'cardnumbers'};
366 my $borrowernumbers = $params{'borrowernumbers'};
368 return unless ($course_id);
370 unless ( $mode eq 'replace'
372 || $mode eq 'delete' );
373 return unless ( $cardnumbers || $borrowernumbers );
374 return if ( $cardnumbers && $borrowernumbers );
376 my ( @cardnumbers, @borrowernumbers );
377 @cardnumbers = @
$cardnumbers if ( ref($cardnumbers) eq 'ARRAY' );
378 @borrowernumbers = @
$borrowernumbers
379 if ( ref($borrowernumbers) eq 'ARRAY' );
381 my $field = (@cardnumbers) ?
'cardnumber' : 'borrowernumber';
382 my @fields = (@cardnumbers) ?
@cardnumbers : @borrowernumbers;
383 my $placeholders = join( ',', ('?') x
scalar @fields );
385 my $dbh = C4
::Context
->dbh;
387 $dbh->do( "DELETE FROM course_instructors WHERE course_id = ?", undef, $course_id )
388 if ( $mode eq 'replace' );
392 if ( $mode eq 'add' || $mode eq 'replace' ) {
394 INSERT INTO course_instructors ( course_id, borrowernumber )
395 SELECT ?, borrowernumber
397 WHERE $field IN ( $placeholders )
401 DELETE FROM course_instructors
403 AND borrowernumber IN (
404 SELECT borrowernumber FROM borrowers WHERE $field IN ( $placeholders )
409 my $sth = $dbh->prepare($query);
411 $sth->execute( $course_id, @fields ) if (@fields);
414 =head2 GetCourseItem {
416 $course_item = GetCourseItem( itemnumber => $itemnumber [, ci_id => $ci_id );
422 warn identify_myself
(%params) if $DEBUG;
424 my $ci_id = $params{'ci_id'};
425 my $itemnumber = $params{'itemnumber'};
427 return unless ( $itemnumber || $ci_id );
429 my $field = ($itemnumber) ?
'itemnumber' : 'ci_id';
430 my $value = ($itemnumber) ?
$itemnumber : $ci_id;
432 my $query = "SELECT * FROM course_items WHERE $field = ?";
433 my $dbh = C4
::Context
->dbh;
434 my $sth = $dbh->prepare($query);
435 $sth->execute($value);
437 my $course_item = $sth->fetchrow_hashref();
440 $query = "SELECT * FROM course_reserves WHERE ci_id = ?";
441 $sth = $dbh->prepare($query);
442 $sth->execute( $course_item->{'ci_id'} );
443 my $course_reserves = $sth->fetchall_arrayref( {} );
445 $course_item->{'course_reserves'} = $course_reserves
446 if ($course_reserves);
451 =head2 ModCourseItem {
453 ModCourseItem( %params );
455 Creates or modifies an existing course item.
461 warn identify_myself
(%params) if $DEBUG;
463 my $itemnumber = $params{'itemnumber'};
464 my $itype = $params{'itype'};
465 my $ccode = $params{'ccode'};
466 my $holdingbranch = $params{'holdingbranch'};
467 my $location = $params{'location'};
469 return unless ($itemnumber);
471 my $course_item = GetCourseItem
( itemnumber
=> $itemnumber );
476 $ci_id = $course_item->{'ci_id'};
480 course_item
=> $course_item,
484 $ci_id = _AddCourseItem
(%params);
491 =head2 _AddCourseItem
493 my $ci_id = _AddCourseItem( %params );
499 warn identify_myself
(%params) if $DEBUG;
501 my ( @fields, @values );
503 push( @fields, 'itemnumber = ?' );
504 push( @values, $params{'itemnumber'} );
508 push( @fields, "$_ = ?" );
509 push( @values, $params{$_} );
513 my $query = "INSERT INTO course_items SET " . join( ',', @fields );
514 my $dbh = C4
::Context
->dbh;
515 $dbh->do( $query, undef, @values );
517 my $ci_id = $dbh->last_insert_id( undef, undef, 'course_items', 'ci_id' );
522 =head2 _UpdateCourseItem
524 _UpdateCourseItem( %params );
528 sub _UpdateCourseItem
{
530 warn identify_myself
(%params) if $DEBUG;
532 my $ci_id = $params{'ci_id'};
533 my $course_item = $params{'course_item'};
534 my $itype = $params{'itype'};
535 my $ccode = $params{'ccode'};
536 my $holdingbranch = $params{'holdingbranch'};
537 my $location = $params{'location'};
539 return unless ( $ci_id || $course_item );
541 $course_item = GetCourseItem
( ci_id
=> $ci_id )
542 unless ($course_item);
543 $ci_id = $course_item->{'ci_id'} unless ($ci_id);
545 ## Revert fields that had an 'original' value, but now don't
546 ## Update the item fields to the stored values from course_items
547 ## and then set those fields in course_items to NULL
548 my @fields_to_revert;
550 if ( !$params{$_} && $course_item->{$_} ) {
551 push( @fields_to_revert, $_ );
556 fields
=> \
@fields_to_revert,
557 course_item
=> $course_item
558 ) if (@fields_to_revert);
560 ## Update fields that still have an original value, but it has changed
561 ## This necessitates only changing the current item values, as we still
562 ## have the original values stored in course_items
566 && $course_item->{$_}
567 && $params{$_} ne $course_item->{$_} ) {
568 $mod_params{$_} = $params{$_};
571 ModItem
( \
%mod_params, undef, $course_item->{'itemnumber'} ) if %mod_params;
573 ## Update fields that didn't have an original value, but now do
574 ## We must save the original value in course_items, and also
575 ## update the item fields to the new value
576 my $item = GetItem
( $course_item->{'itemnumber'} );
580 if ( $params{$_} && !$course_item->{$_} ) {
581 $mod_params_new{$_} = $params{$_};
582 $mod_params_old{$_} = $item->{$_};
585 _ModStoredFields
( 'ci_id' => $params{'ci_id'}, %mod_params_old );
586 ModItem
( \
%mod_params_new, undef, $course_item->{'itemnumber'} ) if %mod_params_new;
590 =head2 _ModStoredFields
592 _ModStoredFields( %params );
594 Updates the values for the 'original' fields in course_items
599 sub _ModStoredFields
{
601 warn identify_myself
(%params) if $DEBUG;
603 return unless ( $params{'ci_id'} );
605 my ( @fields_to_update, @values_to_update );
609 push( @fields_to_update, $_ );
610 push( @values_to_update, $params{$_} );
614 my $query = "UPDATE course_items SET " . join( ',', map { "$_=?" } @fields_to_update ) . " WHERE ci_id = ?";
616 C4
::Context
->dbh->do( $query, undef, @values_to_update, $params{'ci_id'} )
617 if (@values_to_update);
623 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
629 warn identify_myself
(%params) if $DEBUG;
631 my $ci_id = $params{'ci_id'};
632 my $course_item = $params{'course_item'};
633 my $fields = $params{'fields'};
634 my @fields = @
$fields;
636 return unless ($ci_id);
638 $course_item = GetCourseItem
( ci_id
=> $params{'ci_id'} )
639 unless ($course_item);
643 foreach my $field (@fields) {
645 if ( $field eq $_ && $course_item->{$_} ) {
646 $mod_item_params->{$_} = $course_item->{$_};
647 push( @fields_to_null, $_ );
651 ModItem
( $mod_item_params, undef, $course_item->{'itemnumber'} ) if $mod_item_params && %$mod_item_params;
653 my $query = "UPDATE course_items SET " . join( ',', map { "$_=NULL" } @fields_to_null ) . " WHERE ci_id = ?";
655 C4
::Context
->dbh->do( $query, undef, $ci_id ) if (@fields_to_null);
658 =head2 _SwapAllFields
660 _SwapAllFields( $ci_id );
666 warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG;
668 my $course_item = GetCourseItem
( ci_id
=> $ci_id );
669 my $item = GetItem
( $course_item->{'itemnumber'} );
671 my %course_item_fields;
674 if ( $course_item->{$_} ) {
675 $course_item_fields{$_} = $course_item->{$_};
676 $item_fields{$_} = $item->{$_};
680 ModItem
( \
%course_item_fields, undef, $course_item->{'itemnumber'} ) if %course_item_fields;
681 _ModStoredFields
( %item_fields, ci_id
=> $ci_id );
684 =head2 GetCourseItems {
686 $course_items = GetCourseItems(
687 [course_id => $course_id]
688 [, itemnumber => $itemnumber ]
695 warn identify_myself
(%params) if $DEBUG;
697 my $course_id = $params{'course_id'};
698 my $itemnumber = $params{'itemnumber'};
700 return unless ($course_id);
705 my $query = "SELECT * FROM course_items";
707 if ( keys %params ) {
711 foreach my $key ( keys %params ) {
712 push( @query_keys, " $key LIKE ? " );
713 push( @query_values, $params{$key} );
716 $query .= join( ' AND ', @query_keys );
719 my $dbh = C4
::Context
->dbh;
720 my $sth = $dbh->prepare($query);
721 $sth->execute(@query_values);
723 return $sth->fetchall_arrayref( {} );
726 =head2 DelCourseItem {
728 DelCourseItem( ci_id => $cr_id );
734 warn identify_myself
(%params) if $DEBUG;
736 my $ci_id = $params{'ci_id'};
738 return unless ($ci_id);
740 _RevertFields
( ci_id
=> $ci_id, fields
=> \
@FIELDS );
743 DELETE FROM course_items
746 C4
::Context
->dbh->do( $query, undef, $ci_id );
749 =head2 GetCourseReserve {
751 $course_item = GetCourseReserve( %params );
755 sub GetCourseReserve
{
757 warn identify_myself
(%params) if $DEBUG;
759 my $cr_id = $params{'cr_id'};
760 my $course_id = $params{'course_id'};
761 my $ci_id = $params{'ci_id'};
763 return unless ( $cr_id || ( $course_id && $ci_id ) );
765 my $dbh = C4
::Context
->dbh;
770 SELECT * FROM course_reserves
773 $sth = $dbh->prepare($query);
774 $sth->execute($cr_id);
777 SELECT * FROM course_reserves
778 WHERE course_id = ? AND ci_id = ?
780 $sth = $dbh->prepare($query);
781 $sth->execute( $course_id, $ci_id );
784 my $course_reserve = $sth->fetchrow_hashref();
785 return $course_reserve;
788 =head2 ModCourseReserve
790 $id = ModCourseReserve( %params );
794 sub ModCourseReserve
{
796 warn identify_myself
(%params) if $DEBUG;
798 my $course_id = $params{'course_id'};
799 my $ci_id = $params{'ci_id'};
800 my $staff_note = $params{'staff_note'};
801 my $public_note = $params{'public_note'};
803 return unless ( $course_id && $ci_id );
805 my $course_reserve = GetCourseReserve
( course_id
=> $course_id, ci_id
=> $ci_id );
808 my $dbh = C4
::Context
->dbh;
810 if ($course_reserve) {
811 $cr_id = $course_reserve->{'cr_id'};
814 UPDATE course_reserves
815 SET staff_note = ?, public_note = ?
818 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
821 INSERT INTO course_reserves SET
827 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
828 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
831 my $course = GetCourse
($course_id);
832 EnableOrDisableCourseItem
(
833 ci_id
=> $params{'ci_id'},
834 enabled
=> $course->{'enabled'}
840 =head2 GetCourseReserves {
842 $course_reserves = GetCourseReserves( %params );
849 include_courses => 1,
853 sub GetCourseReserves
{
855 warn identify_myself
(%params) if $DEBUG;
857 my $course_id = $params{'course_id'};
858 my $ci_id = $params{'ci_id'};
859 my $include_items = $params{'include_items'};
860 my $include_count = $params{'include_count'};
861 my $include_courses = $params{'include_courses'};
863 return unless ( $course_id || $ci_id );
865 my $field = ($course_id) ?
'course_id' : 'ci_id';
866 my $value = ($course_id) ?
$course_id : $ci_id;
869 SELECT cr.*, ci.itemnumber
870 FROM course_reserves cr, course_items ci
872 AND cr.ci_id = ci.ci_id
874 my $dbh = C4
::Context
->dbh;
875 my $sth = $dbh->prepare($query);
876 $sth->execute($value);
878 my $course_reserves = $sth->fetchall_arrayref( {} );
880 if ($include_items) {
881 foreach my $cr (@
$course_reserves) {
882 $cr->{'course_item'} = GetCourseItem
( ci_id
=> $cr->{'ci_id'} );
883 $cr->{'item'} = GetBiblioFromItemNumber
( $cr->{'itemnumber'} );
884 $cr->{'issue'} = GetOpenIssue
( $cr->{'itemnumber'} );
888 if ($include_count) {
889 foreach my $cr (@
$course_reserves) {
890 $cr->{'reserves_count'} = CountCourseReservesForItem
( ci_id
=> $cr->{'ci_id'} );
894 if ($include_courses) {
895 foreach my $cr (@
$course_reserves) {
896 $cr->{'courses'} = GetCourses
( itemnumber
=> $cr->{'itemnumber'} );
900 return $course_reserves;
903 =head2 DelCourseReserve {
905 DelCourseReserve( cr_id => $cr_id );
909 sub DelCourseReserve
{
911 warn identify_myself
(%params) if $DEBUG;
913 my $cr_id = $params{'cr_id'};
915 return unless ($cr_id);
917 my $dbh = C4
::Context
->dbh;
919 my $course_reserve = GetCourseReserve
( cr_id
=> $cr_id );
922 DELETE FROM course_reserves
925 $dbh->do( $query, undef, $cr_id );
927 ## If there are no other course reserves for this item
928 ## delete the course_item as well
929 unless ( CountCourseReservesForItem
( ci_id
=> $course_reserve->{'ci_id'} ) ) {
930 DelCourseItem
( ci_id
=> $course_reserve->{'ci_id'} );
935 =head2 GetReservesInfo
937 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
939 For a given item, returns an arrayref of reserves hashrefs,
940 with a course hashref under the key 'course'
944 sub GetItemCourseReservesInfo
{
946 warn identify_myself
(%params) if $DEBUG;
948 my $itemnumber = $params{'itemnumber'};
950 return unless ($itemnumber);
952 my $course_item = GetCourseItem
( itemnumber
=> $itemnumber );
954 return unless ( keys %$course_item );
956 my $course_reserves = GetCourseReserves
( ci_id
=> $course_item->{'ci_id'} );
958 foreach my $cr (@
$course_reserves) {
959 $cr->{'course'} = GetCourse
( $cr->{'course_id'} );
962 return $course_reserves;
965 =head2 CountCourseReservesForItem
967 $bool = CountCourseReservesForItem( %params );
969 ci_id - course_item id
971 itemnumber - course_item itemnumber
973 enabled = 'yes' or 'no'
974 Optional, if not supplied, counts reserves
975 for both enabled and disabled courses
979 sub CountCourseReservesForItem
{
981 warn identify_myself
(%params) if $DEBUG;
983 my $ci_id = $params{'ci_id'};
984 my $itemnumber = $params{'itemnumber'};
985 my $enabled = $params{'enabled'};
987 return unless ( $ci_id || $itemnumber );
989 my $course_item = GetCourseItem
( ci_id
=> $ci_id, itemnumber
=> $itemnumber );
991 my @params = ( $course_item->{'ci_id'} );
992 push( @params, $enabled ) if ($enabled);
995 SELECT COUNT(*) AS count
996 FROM course_reserves cr
997 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
1000 $query .= "AND c.enabled = ?" if ($enabled);
1002 my $dbh = C4
::Context
->dbh;
1003 my $sth = $dbh->prepare($query);
1004 $sth->execute(@params);
1006 my $row = $sth->fetchrow_hashref();
1008 return $row->{'count'};
1011 =head2 SearchCourses
1013 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
1019 warn identify_myself
(%params) if $DEBUG;
1021 my $term = $params{'term'};
1023 my $enabled = $params{'enabled'} || '%';
1026 my $query = "SELECT c.* FROM courses c";
1029 LEFT JOIN course_instructors ci
1030 ON ( c.course_id = ci.course_id )
1031 LEFT JOIN borrowers b
1032 ON ( ci.borrowernumber = b.borrowernumber )
1033 LEFT JOIN authorised_values av
1034 ON ( c.department = av.authorised_value )
1036 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
1039 department LIKE ? OR
1040 course_number LIKE ? OR
1042 course_name LIKE ? OR
1044 public_note LIKE ? OR
1045 CONCAT(surname,' ',firstname) LIKE ? OR
1046 CONCAT(firstname,' ',surname) LIKE ? OR
1052 GROUP BY c.course_id
1056 @params = ($term) x
10;
1058 $query .= " ORDER BY department, course_number, section, term, course_name ";
1060 my $dbh = C4
::Context
->dbh;
1061 my $sth = $dbh->prepare($query);
1063 $sth->execute( @params, $enabled );
1065 my $courses = $sth->fetchall_arrayref( {} );
1067 foreach my $c (@
$courses) {
1068 $c->{'instructors'} = GetCourseInstructors
( $c->{'course_id'} );
1074 sub whoami
{ ( caller(1) )[3] }
1075 sub whowasi
{ ( caller(2) )[3] }
1077 sub stringify_params
{
1082 foreach my $key ( keys %params ) {
1083 $string .= " $key => " . $params{$key} . "\n";
1086 return "( $string )";
1089 sub identify_myself
{
1092 return whowasi
() . stringify_params
(%params);
1099 Kyle M Hall <kyle@bywatersolutions.com>