diff --git a/C4/Circulation.pm b/C4/Circulation.pm index 39af484f37..93656d9665 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -2128,8 +2128,19 @@ sub AddReturn { # full item data, but no borrowernumber or checkout info (no issue) my $hbr = Koha::CirculationRules->get_return_branch_policy($item); + # check if returnbranch and homebranch belong to the same float group + my $validate_float = Koha::Libraries->find( $item->homebranch )->validate_float_sibling({ branchcode => $branch }); # get the proper branch to which to return the item - my $returnbranch = $hbr ne 'noreturn' ? $item->$hbr : $branch; + my $returnbranch; + if($hbr eq 'noreturn'){ + $returnbranch = $branch; + }elsif($hbr eq 'returnbylibrarygroup'){ + # if library isn't in same the float group, transfer item to homebranch + $hbr = 'homebranch'; + $returnbranch = $validate_float ? $branch : $item->$hbr; + }else{ + $returnbranch = $item->$hbr; + } # if $hbr was "noreturn" or any other non-item table value, then it should 'float' (i.e. stay at this branch) my $transfer_trigger = $hbr eq 'homebranch' ? 'ReturnToHome' : $hbr eq 'holdingbranch' ? 'ReturnToHolding' : undef; diff --git a/Koha/Library.pm b/Koha/Library.pm index 2e9259b450..7af8868da5 100644 --- a/Koha/Library.pm +++ b/Koha/Library.pm @@ -376,6 +376,48 @@ sub opac_info { }); } +=head3 get_float_group_libraries + +Return all libraries belonging to the same float group + +=cut + +sub get_float_libraries { + my ( $self ) = @_; + + my $library_groups = $self->library_groups; + my @float_libraries; + + while ( my $library_group = $library_groups->next ) { + my $root = Koha::Library::Groups->get_root_ancestor({id => $library_group->id}); + if($root->ft_local_float_group) { + push @float_libraries, $root->all_libraries; + } + } + + my %seen; + @float_libraries = + grep { !$seen{ $_->id }++ } @float_libraries; + + return Koha::Libraries->search({ branchcode => { '-in' => [ keys %seen ] } }); +} + +=head3 validate_float_sibling + +Return if given library is a valid float group member + +=cut + +sub validate_float_sibling { + my ( $self, $params ) = @_; + + return 1 if $params->{branchcode} eq $self->id; + + my $branchcode = $params->{branchcode}; + return $self->get_float_libraries->search( { branchcode => $branchcode } ) + ->count > 0; +} + =head2 Internal methods =head3 _type diff --git a/admin/library_groups.pl b/admin/library_groups.pl index dad58d4771..e37ee339a7 100755 --- a/admin/library_groups.pl +++ b/admin/library_groups.pl @@ -51,6 +51,7 @@ if ( $action eq 'add' ) { my $ft_search_groups_opac = $cgi->param('ft_search_groups_opac') || 0; my $ft_search_groups_staff = $cgi->param('ft_search_groups_staff') || 0; my $ft_local_hold_group = $cgi->param('ft_local_hold_group') || 0; + my $ft_local_float_group = $cgi->param('ft_local_float_group') || 0; if ( !$branchcode && Koha::Library::Groups->search( { title => $title } )->count() ) { $template->param( error_duplicate_title => $title ); @@ -67,6 +68,7 @@ if ( $action eq 'add' ) { ft_search_groups_staff => $ft_search_groups_staff, ft_local_hold_group => $ft_local_hold_group, ft_limit_item_editing => $ft_limit_item_editing, + ft_local_float_group => $ft_local_float_group, branchcode => $branchcode, } )->store(); @@ -88,6 +90,7 @@ elsif ( $action eq 'edit' ) { my $ft_search_groups_opac = $cgi->param('ft_search_groups_opac') || 0; my $ft_search_groups_staff = $cgi->param('ft_search_groups_staff') || 0; my $ft_local_hold_group = $cgi->param('ft_local_hold_group') || 0; + my $ft_local_float_group = $cgi->param('ft_local_float_group') || 0; if ($id) { my $group = Koha::Library::Groups->find($id); @@ -101,6 +104,7 @@ elsif ( $action eq 'edit' ) { ft_search_groups_opac => $ft_search_groups_opac, ft_search_groups_staff => $ft_search_groups_staff, ft_local_hold_group => $ft_local_hold_group, + ft_local_float_group => $ft_local_float_group, } )->store(); diff --git a/circ/returns.pl b/circ/returns.pl index 65160e16ce..9b6efed481 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -298,8 +298,10 @@ if ($barcode) { # make sure return branch respects home branch circulation rules, default to homebranch my $hbr = Koha::CirculationRules->get_return_branch_policy($item); - $returnbranch = $hbr ne 'noreturn' ? $item->$hbr : $userenv_branch; # can be noreturn, homebranch or holdingbranch - + my $validate_float = Koha::Libraries->find( $item->homebranch )->validate_float_sibling({ branchcode => $userenv_branch }); + # get the proper branch to which to return the item + # if library isn't in same the float group, transfer item to homelibrary + $returnbranch = $hbr eq 'noreturn' ? $userenv_branch : $hbr eq 'returnbylibrarygroup' ? $validate_float ? $userenv_branch : $item->homebranch : $item->$hbr; my $materials = $item->materials; my $descriptions = Koha::AuthorisedValues->get_description_by_koha_field({frameworkcode => '', kohafield =>'items.materials', authorised_value => $materials }); $materials = $descriptions->{lib} // $materials; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt index c179ec4e1a..fc081aa8f7 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/library_groups.tt @@ -158,6 +158,12 @@ Is local hold group
++ +
@@ -228,6 +234,12 @@ Is local hold group ++ +
@@ -309,7 +321,8 @@ var ft_search_groups_opac = $(this).data('groupFt_search_groups_opac'); var ft_search_groups_staff = $(this).data('groupFt_search_groups_staff'); var ft_local_hold_group = $(this).data('groupFt_local_hold_group'); - edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing ); + var ft_local_float_group = $(this).data('groupFt_local_float_group'); + edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing, ft_local_float_group ); }); $('.delete-group').on('click', function(e) { @@ -346,6 +359,7 @@ $('#add-group-modal-ft_search_groups_opac').prop('checked', false); $('#add-group-modal-ft_search_groups_staff').prop('checked', false); $('#add-group-modal-ft_local_hold_group').prop('checked', false); + $('#add-group-modal-ft_local_float_group').prop('checked', false); if ( parent_id ) { $('#root-group-features-add').hide(); } else { @@ -355,17 +369,18 @@ } - function edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing ) { + function edit_group( id, parent_id, title, description, ft_hide_patron_info, ft_search_groups_opac, ft_search_groups_staff, ft_local_hold_group, ft_limit_item_editing, ft_local_float_group ) { $('#edit-group-modal-id').val( id ); $('#edit-group-modal-title').val( title ); $('#edit-group-modal-description').val( description ); - + console.log(ft_local_float_group); if ( parent_id ) { $('#edit-group-modal-ft_hide_patron_info').prop('checked', false); $('#edit-group-modal-ft_limit_item_editing').prop('checked', false); $('#edit-group-modal-ft_search_groups_opac').prop('checked', false); $('#edit-group-modal-ft_search_groups_staff').prop('checked', false); $('#edit-group-modal-ft_local_hold_group').prop('checked', false); + $('#edit-group-modal-ft_local_float_group').prop('checked', false); $('#root-group-features-edit').hide(); } else { $('#edit-group-modal-ft_hide_patron_info').prop('checked', ft_hide_patron_info ? true : false ); @@ -373,6 +388,7 @@ $('#edit-group-modal-ft_search_groups_opac').prop('checked', ft_search_groups_opac ? true : false ); $('#edit-group-modal-ft_search_groups_staff').prop('checked', ft_search_groups_staff ? true : false ); $('#edit-group-modal-ft_local_hold_group').prop('checked', ft_local_hold_group ? true : false ); + $('#edit-group-modal-ft_local_float_group').prop('checked', ft_local_float_group ? true : false ); $('#root-group-features-edit').show(); } @@ -431,6 +447,9 @@ [% IF group.ft_local_hold_group %]