X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FCourseReserves.pm;h=061c8399257e6b96033a6a480478e8f512cd285a;hb=84a203ca0584278d9851c5a47dd4cb7964914cea;hp=18fa4a124b93eff950fbd9713441e1421c7f36e8;hpb=313b47c94e6397fc0ad0d8c0022941cd1cc3c476;p=srvgit diff --git a/C4/CourseReserves.pm b/C4/CourseReserves.pm index 18fa4a124b..061c839925 100644 --- a/C4/CourseReserves.pm +++ b/C4/CourseReserves.pm @@ -22,7 +22,12 @@ use List::MoreUtils qw(any); use C4::Context; use C4::Circulation qw(GetOpenIssue); -use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG @FIELDS); +use Koha::Courses; +use Koha::Course::Instructors; +use Koha::Course::Items; +use Koha::Course::Reserves; + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS @FIELDS); BEGIN { require Exporter; @@ -50,8 +55,7 @@ BEGIN { ); %EXPORT_TAGS = ( 'all' => \@EXPORT_OK ); - $DEBUG = 0; - @FIELDS = ( 'itype', 'ccode', 'holdingbranch', 'location' ); + @FIELDS = ( 'itype', 'ccode', 'homebranch', 'holdingbranch', 'location' ); } =head1 NAME @@ -76,21 +80,18 @@ This module deals with course reserves. sub GetCourse { my ($course_id) = @_; - warn whoami() . "( $course_id )" if $DEBUG; - my $query = "SELECT * FROM courses WHERE course_id = ?"; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare($query); - $sth->execute($course_id); + my $course = Koha::Courses->find( $course_id ); + return unless $course; + $course = $course->unblessed; - my $course = $sth->fetchrow_hashref(); - - $query = " + my $dbh = C4::Context->dbh; + my $query = " SELECT b.* FROM course_instructors ci LEFT JOIN borrowers b ON ( ci.borrowernumber = b.borrowernumber ) WHERE course_id = ? "; - $sth = $dbh->prepare($query); + my $sth = $dbh->prepare($query); $sth->execute($course_id); $course->{'instructors'} = $sth->fetchall_arrayref( {} ); @@ -105,7 +106,6 @@ sub GetCourse { sub ModCourse { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $dbh = C4::Context->dbh; @@ -155,7 +155,6 @@ sub ModCourse { sub GetCourses { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my @query_keys; my @query_values; @@ -238,7 +237,6 @@ sub DelCourse { sub EnableOrDisableCourseItems { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $course_id = $params{'course_id'}; my $enabled = $params{'enabled'} || 0; @@ -287,7 +285,6 @@ sub EnableOrDisableCourseItems { sub EnableOrDisableCourseItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $ci_id = $params{'ci_id'}; @@ -295,7 +292,7 @@ sub EnableOrDisableCourseItem { my $course_item = GetCourseItem( ci_id => $ci_id ); - my $info = GetItemCourseReservesInfo( itemnumber => $course_item->{itemnumber} ); + my $info = $course_item->{itemnumber} ? GetItemCourseReservesInfo( itemnumber => $course_item->{itemnumber} ) : GetItemCourseReservesInfo( biblionumber => $course_item->{biblionumber} ); my $enabled = any { $_->{course}->{enabled} eq 'yes' } @$info; $enabled = $enabled ? 'yes' : 'no'; @@ -304,7 +301,7 @@ sub EnableOrDisableCourseItem { ## or disable and already disabled item, ## as that would cause the fields to swap if ( $course_item->{'enabled'} ne $enabled ) { - _SwapAllFields($ci_id); + _SwapAllFields($ci_id, $enabled ); my $query = " UPDATE course_items @@ -326,8 +323,6 @@ sub EnableOrDisableCourseItem { sub GetCourseInstructors { my ($course_id) = @_; - warn "C4::CourseReserves::GetCourseInstructors( $course_id )" - if $DEBUG; my $query = " SELECT * FROM borrowers @@ -356,7 +351,6 @@ sub GetCourseInstructors { sub ModCourseInstructors { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $course_id = $params{'course_id'}; my $mode = $params{'mode'}; @@ -417,15 +411,24 @@ sub ModCourseInstructors { sub GetCourseItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $ci_id = $params{'ci_id'}; my $itemnumber = $params{'itemnumber'}; + my $biblionumber = $params{'biblionumber'}; - return unless ( $itemnumber || $ci_id ); + return unless ( $itemnumber || $biblionumber || $ci_id ); - my $field = ($itemnumber) ? 'itemnumber' : 'ci_id'; - my $value = ($itemnumber) ? $itemnumber : $ci_id; + my ( $field, $value ); + if ( $itemnumber ) { + $field = 'itemnumber'; + $value = $itemnumber; + } elsif ( $biblionumber ) { + $field = 'biblionumber'; + $value = $biblionumber; + } else { + $field = 'ci_id'; + $value = $ci_id; + } my $query = "SELECT * FROM course_items WHERE $field = ?"; my $dbh = C4::Context->dbh; @@ -456,13 +459,18 @@ sub GetCourseItem { sub ModCourseItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $itemnumber = $params{'itemnumber'}; + my $biblionumber = $params{'biblionumber'}; + + return unless ($itemnumber || $biblionumber); - return unless ($itemnumber); + my $course_item = $itemnumber ? GetCourseItem( itemnumber => $itemnumber ) : GetCourseItem( biblionumber => $biblionumber ); - my $course_item = GetCourseItem( itemnumber => $itemnumber ); + if ( $itemnumber and !$biblionumber ) { + $biblionumber = Koha::Items->find( $itemnumber )->biblionumber; + $params{biblionumber} = $biblionumber; + } my $ci_id; @@ -490,25 +498,23 @@ sub ModCourseItem { sub _AddCourseItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; - my ( @fields, @values ); + $params{homebranch} ||= undef; # Can't be empty string, FK constraint + $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint - push( @fields, 'itemnumber = ?' ); - push( @values, $params{'itemnumber'} ); + my %data = map { $_ => $params{$_} } @FIELDS; + my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS; - foreach (@FIELDS) { - push( @fields, "$_ = ?" ); - push( @values, $params{$_} || undef ); - } - - my $query = "INSERT INTO course_items SET " . join( ',', @fields ); - my $dbh = C4::Context->dbh; - $dbh->do( $query, undef, @values ); - - my $ci_id = $dbh->last_insert_id( undef, undef, 'course_items', 'ci_id' ); + my $ci = Koha::Course::Item->new( + { + itemnumber => $params{itemnumber}, + biblionumber => $params{biblionumber}, + %data, + %enabled, + } + )->store(); - return $ci_id; + return $ci->id; } =head2 _UpdateCourseItem @@ -519,57 +525,56 @@ sub _AddCourseItem { sub _UpdateCourseItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $ci_id = $params{'ci_id'}; my $course_item = $params{'course_item'}; - return unless ( $ci_id || $course_item ); - - $course_item = GetCourseItem( ci_id => $ci_id ) - unless ($course_item); - $ci_id = $course_item->{'ci_id'} unless ($ci_id); - - my %mod_params = - map { - defined $params{$_} && $params{$_} ne '' - ? ( $_ => $params{$_} ) - : () - } @FIELDS; - - Koha::Items->find( $course_item->{itemnumber} ) - ->set( \%mod_params ) - ->store; -} - -=head2 _ModStoredFields + $params{homebranch} ||= undef; # Can't be empty string, FK constraint + $params{holdingbranch} ||= undef; # Can't be empty string, FK constraint - _ModStoredFields( %params ); - - Updates the values for the 'original' fields in course_items - for a given ci_id - -=cut - -sub _ModStoredFields { - my (%params) = @_; - warn identify_myself(%params) if $DEBUG; - - return unless ( $params{'ci_id'} ); + return unless ( $ci_id || $course_item ); - my ( @fields_to_update, @values_to_update ); + $course_item = Koha::Course::Items->find( $ci_id || $course_item->{ci_id} ); + + my %data = map { $_ => $params{$_} } @FIELDS; + my %enabled = map { $_ . "_enabled" => $params{ $_ . "_enabled" } } @FIELDS; + + if ( $course_item->itemnumber ) { + # biblio-level course items don't store any of these fields + my $item = Koha::Items->find( $course_item->itemnumber ); + + # Handle updates to changed fields for a course item, both adding and removing + if ( $course_item->is_enabled ) { + my $item_fields = {}; + + for my $field ( @FIELDS ) { + + my $field_enabled = $field . '_enabled'; + my $field_storage = $field . '_storage'; + + # Find newly enabled field and add item value to storage + if ( $params{$field_enabled} && !$course_item->$field_enabled ) { + $enabled{$field_storage} = $item->$field; + $item_fields->{$field} = $params{$field}; + } + # Find newly disabled field and copy the storage value to the item, unset storage value + elsif ( !$params{$field_enabled} && $course_item->$field_enabled ) { + $item_fields->{$field} = $course_item->$field_storage; + $enabled{$field_storage} = undef; + } + # The field was already enabled, copy the incoming value to the item. + # The "original" ( when not on course reserve ) value is already in the storage field + elsif ( $course_item->$field_enabled) { + $item_fields->{$field} = $params{$field}; + } + } - foreach (@FIELDS) { - if ( defined($params{$_}) ) { - push( @fields_to_update, $_ ); - push( @values_to_update, $params{$_} ); + $item->set( $item_fields )->store + if keys %$item_fields; } } - my $query = "UPDATE course_items SET " . join( ',', map { "$_=?" } @fields_to_update ) . " WHERE ci_id = ?"; - - C4::Context->dbh->do( $query, undef, @values_to_update, $params{'ci_id'} ) - if (@values_to_update); + $course_item->update( { %data, %enabled } ); } @@ -577,23 +582,37 @@ sub _ModStoredFields { _RevertFields( ci_id => $ci_id, fields => \@fields_to_revert ); + Copies fields from course item storage back to the actual item + =cut sub _RevertFields { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $ci_id = $params{'ci_id'}; - return unless ($ci_id); + return unless $ci_id; - my $course_item = GetCourseItem( ci_id => $params{'ci_id'} ); - my $course_item_object = Koha::Items->find($course_item->{'itemnumber'}); - foreach my $field ( @FIELDS ) { - next unless defined $course_item->{$field}; - $course_item_object->$field($course_item->{$field}); - } - $course_item_object->store; + my $course_item = Koha::Course::Items->find( $ci_id ); + + my $item_fields = {}; + $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled; + $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled; + $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled; + $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled; + $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled; + + Koha::Items->find( $course_item->itemnumber ) + ->set( $item_fields ) + ->store + if keys %$item_fields; + + $course_item->itype_storage(undef); + $course_item->ccode_storage(undef); + $course_item->location_storage(undef); + $course_item->homebranch_storage(undef); + $course_item->holdingbranch_storage(undef); + $course_item->store(); } =head2 _SwapAllFields @@ -603,21 +622,51 @@ sub _RevertFields { =cut sub _SwapAllFields { - my ($ci_id) = @_; - warn "C4::CourseReserves::_SwapFields( $ci_id )" if $DEBUG; - - my $course_item = GetCourseItem( ci_id => $ci_id ); - my $item = Koha::Items->find($course_item->{'itemnumber'}); - - my %item_fields; - foreach (@FIELDS) { - if ( defined( $course_item->{$_} ) ) { - $item_fields{$_} = $item->$_ || q{}; - $item->$_($course_item->{$_}); - } + my ( $ci_id, $enabled ) = @_; + + my $course_item = Koha::Course::Items->find( $ci_id ); + my $item = Koha::Items->find( $course_item->itemnumber ); + + if ( $enabled eq 'yes' ) { # Copy item fields to course item storage, course item fields to item + $course_item->itype_storage( $item->effective_itemtype ) if $course_item->itype_enabled; + $course_item->ccode_storage( $item->ccode ) if $course_item->ccode_enabled; + $course_item->location_storage( $item->location ) if $course_item->location_enabled; + $course_item->homebranch_storage( $item->homebranch ) if $course_item->homebranch_enabled; + $course_item->holdingbranch_storage( $item->holdingbranch ) if $course_item->holdingbranch_enabled; + $course_item->store(); + + my $item_fields = {}; + $item_fields->{itype} = $course_item->itype if $course_item->itype_enabled; + $item_fields->{ccode} = $course_item->ccode if $course_item->ccode_enabled; + $item_fields->{location} = $course_item->location if $course_item->location_enabled; + $item_fields->{homebranch} = $course_item->homebranch if $course_item->homebranch_enabled; + $item_fields->{holdingbranch} = $course_item->holdingbranch if $course_item->holdingbranch_enabled; + + Koha::Items->find( $course_item->itemnumber ) + ->set( $item_fields ) + ->store + if keys %$item_fields; + + } else { # Copy course item storage to item + my $item_fields = {}; + $item_fields->{itype} = $course_item->itype_storage if $course_item->itype_enabled; + $item_fields->{ccode} = $course_item->ccode_storage if $course_item->ccode_enabled; + $item_fields->{location} = $course_item->location_storage if $course_item->location_enabled; + $item_fields->{homebranch} = $course_item->homebranch_storage if $course_item->homebranch_enabled; + $item_fields->{holdingbranch} = $course_item->holdingbranch_storage if $course_item->holdingbranch_enabled; + + Koha::Items->find( $course_item->itemnumber ) + ->set( $item_fields ) + ->store + if keys %$item_fields; + + $course_item->itype_storage(undef); + $course_item->ccode_storage(undef); + $course_item->location_storage(undef); + $course_item->homebranch_storage(undef); + $course_item->holdingbranch_storage(undef); + $course_item->store(); } - $item->store; - _ModStoredFields( %item_fields, ci_id => $ci_id ); } =head2 GetCourseItems { @@ -631,7 +680,6 @@ sub _SwapAllFields { sub GetCourseItems { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $course_id = $params{'course_id'}; my $itemnumber = $params{'itemnumber'}; @@ -670,13 +718,15 @@ sub GetCourseItems { sub DelCourseItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $ci_id = $params{'ci_id'}; return unless ($ci_id); - _RevertFields( ci_id => $ci_id ); + my $course_item = Koha::Course::Items->find( $ci_id ); + return unless $course_item; + + _RevertFields( ci_id => $ci_id ) if $course_item->enabled eq 'yes'; my $query = " DELETE FROM course_items @@ -693,7 +743,6 @@ sub DelCourseItem { sub GetCourseReserve { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $cr_id = $params{'cr_id'}; my $course_id = $params{'course_id'}; @@ -732,7 +781,6 @@ sub GetCourseReserve { sub ModCourseReserve { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $course_id = $params{'course_id'}; my $ci_id = $params{'ci_id'}; @@ -789,7 +837,6 @@ sub ModCourseReserve { sub GetCourseReserves { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $course_id = $params{'course_id'}; my $ci_id = $params{'ci_id'}; @@ -803,7 +850,7 @@ sub GetCourseReserves { my $value = ($course_id) ? $course_id : $ci_id; my $query = " - SELECT cr.*, ci.itemnumber + SELECT cr.*, ci.itemnumber, ci.biblionumber FROM course_reserves cr, course_items ci WHERE cr.$field = ? AND cr.ci_id = ci.ci_id @@ -817,7 +864,7 @@ sub GetCourseReserves { if ($include_items) { foreach my $cr (@$course_reserves) { my $item = Koha::Items->find( $cr->{itemnumber} ); - my $biblio = $item->biblio; + my $biblio = $cr->{itemnumber} ? $item->biblio : Koha::Biblios->find( $cr->{biblionumber} ); my $biblioitem = $biblio->biblioitem; $cr->{'course_item'} = GetCourseItem( ci_id => $cr->{'ci_id'} ); $cr->{'item'} = $item; @@ -835,7 +882,7 @@ sub GetCourseReserves { if ($include_courses) { foreach my $cr (@$course_reserves) { - $cr->{'courses'} = GetCourses( itemnumber => $cr->{'itemnumber'} ); + $cr->{'courses'} = $cr->{itemnumber} ? GetCourses( itemnumber => $cr->{'itemnumber'} ) : GetCourses( biblionumber => $cr->{biblionumber} ); } } @@ -850,7 +897,6 @@ sub GetCourseReserves { sub DelCourseReserve { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $cr_id = $params{'cr_id'}; @@ -877,6 +923,7 @@ sub DelCourseReserve { =head2 GetItemCourseReservesInfo my $arrayref = GetItemCourseReservesInfo( itemnumber => $itemnumber ); + my $arrayref = GetItemCourseReservesInfo( biblionumber => $biblionumber ); For a given item, returns an arrayref of reserves hashrefs, with a course hashref under the key 'course' @@ -885,13 +932,13 @@ sub DelCourseReserve { sub GetItemCourseReservesInfo { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $itemnumber = $params{'itemnumber'}; + my $biblionumber = $params{'biblionumber'}; - return unless ($itemnumber); + return unless ($itemnumber || $biblionumber); - my $course_item = GetCourseItem( itemnumber => $itemnumber ); + my $course_item = $itemnumber ? GetCourseItem( itemnumber => $itemnumber ) : GetCourseItem( biblionumber => $biblionumber ); return unless ( keys %$course_item ); @@ -911,6 +958,8 @@ sub GetItemCourseReservesInfo { ci_id - course_item id OR itemnumber - course_item itemnumber + OR + biblionumber - course_item biblionumber enabled = 'yes' or 'no' Optional, if not supplied, counts reserves @@ -920,15 +969,15 @@ sub GetItemCourseReservesInfo { sub CountCourseReservesForItem { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $ci_id = $params{'ci_id'}; my $itemnumber = $params{'itemnumber'}; my $enabled = $params{'enabled'}; + my $biblionumber = $params{'biblionumber'}; - return unless ( $ci_id || $itemnumber ); + return unless ( $ci_id || ( $itemnumber || $biblionumber ) ); - my $course_item = GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber ); + my $course_item = $itemnumber ? GetCourseItem( ci_id => $ci_id, itemnumber => $itemnumber ) : GetCourseItem( ci_id => $ci_id, biblionumber => $biblionumber ); my @params = ( $course_item->{'ci_id'} ); push( @params, $enabled ) if ($enabled); @@ -958,7 +1007,6 @@ sub CountCourseReservesForItem { sub SearchCourses { my (%params) = @_; - warn identify_myself(%params) if $DEBUG; my $term = $params{'term'}; @@ -1029,12 +1077,6 @@ sub stringify_params { return "( $string )"; } -sub identify_myself { - my (%params) = @_; - - return whowasi() . stringify_params(%params); -} - 1; =head1 AUTHOR