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 $course_item->update( { %data, %enabled } );
539 if ( $course_item->is_enabled ) {
540 my $item_fields = {};
541 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
542 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
543 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
544 $item_fields->{homebranch} = $course_item->homebranch if $course_item->homebranch_enabled;
545 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
547 Koha::Items->find( $course_item->itemnumber )
548 ->set( $item_fields )
550 if keys %$item_fields;
558 _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert );
560 Copies fields from course item storage back to the actual item
566 warn identify_myself(%params) if $DEBUG;
568 my $ci_id = $params{'ci_id'};
570 return unless $ci_id;
572 my $course_item = Koha::Course::Items->find( $ci_id );
574 my $item_fields = {};
575 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
576 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
577 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
578 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
579 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
581 Koha::Items->find( $course_item->itemnumber )
582 ->set( $item_fields )
584 if keys %$item_fields;
586 $course_item->itype_storage(undef);
587 $course_item->ccode_storage(undef);
588 $course_item->location_storage(undef);
589 $course_item->homebranch_storage(undef);
590 $course_item->holdingbranch_storage(undef);
591 $course_item->store();
594 =head2 _SwapAllFields
596 _SwapAllFields( $ci_id );
601 my ( $ci_id, $enabled ) = @_;
602 warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG;
604 my $course_item = Koha::Course::Items->find( $ci_id );
605 my $item = Koha::Items->find( $course_item->itemnumber );
607 if ( $enabled eq 'yes' ) { # Copy item fields to course item storage, course item fields to item
608 $course_item->itype_storage( $item->effective_itemtype ) if $course_item->itype_enabled;
609 $course_item->ccode_storage( $item->ccode ) if $course_item->ccode_enabled;
610 $course_item->location_storage( $item->location ) if $course_item->location_enabled;
611 $course_item->homebranch_storage( $item->homebranch ) if $course_item->homebranch_enabled;
612 $course_item->holdingbranch_storage( $item->holdingbranch ) if $course_item->holdingbranch_enabled;
613 $course_item->store();
615 my $item_fields = {};
616 $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled;
617 $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled;
618 $item_fields->{location} = $course_item->location if $course_item->location_enabled;
619 $item_fields->{homebranch} = $course_item->homebranch if $course_item->homebranch_enabled;
620 $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled;
622 Koha::Items->find( $course_item->itemnumber )
623 ->set( $item_fields )
625 if keys %$item_fields;
627 } else { # Copy course item storage to item
628 my $item_fields = {};
629 $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled;
630 $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled;
631 $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled;
632 $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled;
633 $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled;
635 Koha::Items->find( $course_item->itemnumber )
636 ->set( $item_fields )
638 if keys %$item_fields;
640 $course_item->itype_storage(undef);
641 $course_item->ccode_storage(undef);
642 $course_item->location_storage(undef);
643 $course_item->homebranch_storage(undef);
644 $course_item->holdingbranch_storage(undef);
645 $course_item->store();
649 =head2 GetCourseItems {
651 $course_items = GetCourseItems(
652 [course_id => $course_id]
653 [, itemnumber => $itemnumber ]
660 warn identify_myself(%params) if $DEBUG;
662 my $course_id = $params{'course_id'};
663 my $itemnumber = $params{'itemnumber'};
665 return unless ($course_id);
670 my $query = "SELECT * FROM course_items";
672 if ( keys %params ) {
676 foreach my $key ( keys %params ) {
677 push( @query_keys, " $key LIKE ? " );
678 push( @query_values, $params{$key} );
681 $query .= join( ' AND ', @query_keys );
684 my $dbh = C4::Context->dbh;
685 my $sth = $dbh->prepare($query);
686 $sth->execute(@query_values);
688 return $sth->fetchall_arrayref( {} );
691 =head2 DelCourseItem {
693 DelCourseItem( ci_id => $cr_id );
699 warn identify_myself(%params) if $DEBUG;
701 my $ci_id = $params{'ci_id'};
703 return unless ($ci_id);
705 _RevertFields( ci_id => $ci_id );
708 DELETE FROM course_items
711 C4::Context->dbh->do( $query, undef, $ci_id );
714 =head2 GetCourseReserve {
716 $course_item = GetCourseReserve( %params );
720 sub GetCourseReserve {
722 warn identify_myself(%params) if $DEBUG;
724 my $cr_id = $params{'cr_id'};
725 my $course_id = $params{'course_id'};
726 my $ci_id = $params{'ci_id'};
728 return unless ( $cr_id || ( $course_id && $ci_id ) );
730 my $dbh = C4::Context->dbh;
735 SELECT * FROM course_reserves
738 $sth = $dbh->prepare($query);
739 $sth->execute($cr_id);
742 SELECT * FROM course_reserves
743 WHERE course_id = ? AND ci_id = ?
745 $sth = $dbh->prepare($query);
746 $sth->execute( $course_id, $ci_id );
749 my $course_reserve = $sth->fetchrow_hashref();
750 return $course_reserve;
753 =head2 ModCourseReserve
755 $id = ModCourseReserve( %params );
759 sub ModCourseReserve {
761 warn identify_myself(%params) if $DEBUG;
763 my $course_id = $params{'course_id'};
764 my $ci_id = $params{'ci_id'};
765 my $staff_note = $params{'staff_note'};
766 my $public_note = $params{'public_note'};
768 return unless ( $course_id && $ci_id );
770 my $course_reserve = GetCourseReserve( course_id => $course_id, ci_id => $ci_id );
773 my $dbh = C4::Context->dbh;
775 if ($course_reserve) {
776 $cr_id = $course_reserve->{'cr_id'};
779 UPDATE course_reserves
780 SET staff_note = ?, public_note = ?
783 $dbh->do( $query, undef, $staff_note, $public_note, $cr_id );
786 INSERT INTO course_reserves SET
792 $dbh->do( $query, undef, $course_id, $ci_id, $staff_note, $public_note );
793 $cr_id = $dbh->last_insert_id( undef, undef, 'course_reserves', 'cr_id' );
796 EnableOrDisableCourseItem(
797 ci_id => $params{'ci_id'},
803 =head2 GetCourseReserves {
805 $course_reserves = GetCourseReserves( %params );
812 include_courses => 1,
816 sub GetCourseReserves {
818 warn identify_myself(%params) if $DEBUG;
820 my $course_id = $params{'course_id'};
821 my $ci_id = $params{'ci_id'};
822 my $include_items = $params{'include_items'};
823 my $include_count = $params{'include_count'};
824 my $include_courses = $params{'include_courses'};
826 return unless ( $course_id || $ci_id );
828 my $field = ($course_id) ? 'course_id' : 'ci_id';
829 my $value = ($course_id) ? $course_id : $ci_id;
832 SELECT cr.*, ci.itemnumber
833 FROM course_reserves cr, course_items ci
835 AND cr.ci_id = ci.ci_id
837 my $dbh = C4::Context->dbh;
838 my $sth = $dbh->prepare($query);
839 $sth->execute($value);
841 my $course_reserves = $sth->fetchall_arrayref( {} );
843 if ($include_items) {
844 foreach my $cr (@$course_reserves) {
845 my $item = Koha::Items->find( $cr->{itemnumber} );
846 my $biblio = $item->biblio;
847 my $biblioitem = $biblio->biblioitem;
848 $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} );
849 $cr->{'item'} = $item;
850 $cr->{'biblio'} = $biblio;
851 $cr->{'biblioitem'} = $biblioitem;
852 $cr->{'issue'} = GetOpenIssue( $cr->{'itemnumber'} );
856 if ($include_count) {
857 foreach my $cr (@$course_reserves) {
858 $cr->{'reserves_count'} = CountCourseReservesForItem( ci_id => $cr->{'ci_id'} );
862 if ($include_courses) {
863 foreach my $cr (@$course_reserves) {
864 $cr->{'courses'} = GetCourses( itemnumber => $cr->{'itemnumber'} );
868 return $course_reserves;
871 =head2 DelCourseReserve {
873 DelCourseReserve( cr_id => $cr_id );
877 sub DelCourseReserve {
879 warn identify_myself(%params) if $DEBUG;
881 my $cr_id = $params{'cr_id'};
883 return unless ($cr_id);
885 my $dbh = C4::Context->dbh;
887 my $course_reserve = GetCourseReserve( cr_id => $cr_id );
890 DELETE FROM course_reserves
893 $dbh->do( $query, undef, $cr_id );
895 ## If there are no other course reserves for this item
896 ## delete the course_item as well
897 unless ( CountCourseReservesForItem( ci_id => $course_reserve->{'ci_id'} ) ) {
898 DelCourseItem( ci_id => $course_reserve->{'ci_id'} );
903 =head2 GetItemCourseReservesInfo
905 my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber );
907 For a given item, returns an arrayref of reserves hashrefs,
908 with a course hashref under the key 'course'
912 sub GetItemCourseReservesInfo {
914 warn identify_myself(%params) if $DEBUG;
916 my $itemnumber = $params{'itemnumber'};
918 return unless ($itemnumber);
920 my $course_item = GetCourseItem( itemnumber => $itemnumber );
922 return unless ( keys %$course_item );
924 my $course_reserves = GetCourseReserves( ci_id => $course_item->{'ci_id'} );
926 foreach my $cr (@$course_reserves) {
927 $cr->{'course'} = GetCourse( $cr->{'course_id'} );
930 return $course_reserves;
933 =head2 CountCourseReservesForItem
935 $bool = CountCourseReservesForItem( %params );
937 ci_id - course_item id
939 itemnumber - course_item itemnumber
941 enabled = 'yes' or 'no'
942 Optional, if not supplied, counts reserves
943 for both enabled and disabled courses
947 sub CountCourseReservesForItem {
949 warn identify_myself(%params) if $DEBUG;
951 my $ci_id = $params{'ci_id'};
952 my $itemnumber = $params{'itemnumber'};
953 my $enabled = $params{'enabled'};
955 return unless ( $ci_id || $itemnumber );
957 my $course_item = GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber );
959 my @params = ( $course_item->{'ci_id'} );
960 push( @params, $enabled ) if ($enabled);
963 SELECT COUNT(*) AS count
964 FROM course_reserves cr
965 LEFT JOIN courses c ON ( c.course_id = cr.course_id )
968 $query .= "AND c.enabled = ?" if ($enabled);
970 my $dbh = C4::Context->dbh;
971 my $sth = $dbh->prepare($query);
972 $sth->execute(@params);
974 my $row = $sth->fetchrow_hashref();
976 return $row->{'count'};
981 my $courses = SearchCourses( term => $search_term, enabled => 'yes' );
987 warn identify_myself(%params) if $DEBUG;
989 my $term = $params{'term'};
991 my $enabled = $params{'enabled'} || '%';
995 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
997 LEFT JOIN course_instructors ci
998 ON ( c.course_id = ci.course_id )
999 LEFT JOIN borrowers b
1000 ON ( ci.borrowernumber = b.borrowernumber )
1001 LEFT JOIN authorised_values av
1002 ON ( c.department = av.authorised_value )
1004 ( av.category = 'DEPARTMENT' OR av.category = 'TERM' )
1007 department LIKE ? OR
1008 course_number LIKE ? OR
1010 course_name LIKE ? OR
1012 public_note LIKE ? OR
1013 CONCAT(surname,' ',firstname) LIKE ? OR
1014 CONCAT(firstname,' ',surname) LIKE ? OR
1020 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
1025 @params = ($term) x 10;
1027 $query .= " ORDER BY department, course_number, section, term, course_name ";
1029 my $dbh = C4::Context->dbh;
1030 my $sth = $dbh->prepare($query);
1032 $sth->execute( @params, $enabled );
1034 my $courses = $sth->fetchall_arrayref( {} );
1036 foreach my $c (@$courses) {
1037 $c->{'instructors'} = GetCourseInstructors( $c->{'course_id'} );
1043 sub whoami { ( caller(1) )[3] }
1044 sub whowasi { ( caller(2) )[3] }
1046 sub stringify_params {
1051 foreach my $key ( keys %params ) {
1052 $string .= " $key => " . $params{$key} . "\n";
1055 return "( $string )";
1058 sub identify_myself {
1061 return whowasi() . stringify_params(%params);
1068 Kyle M Hall <kyle@bywatersolutions.com>