From 7db88debd420e4ad2cbc86a79cbfb016f043ab60 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Mon, 10 Jun 2019 15:17:35 +0100 Subject: [PATCH] Bug 22569: Add a 'Transfers to send' report This patch adds a 'Transfers to send' report to the circulation page which displays items which have been triggered for transfer by the stock rotation subsystem. Caveats: 1) It is currently limited to transfers prompted by stockrotation 2) There is no way to differentiate between a transfer that has been requested and a transfer than has been actually sent. (but we do filter out transfers that have been marked as received) 3) Both 'Advance' and 'Repatriate' actions will be listed and the 'Advance' listings should have the option to set the item as 'In demand' at the current branch and thus cancel the transfer and make the item wait an additional stage period before being automatically set to transfer again. I believe we should enhance the transfers system as a whole to allow this report to be more meaningful and include transfer initiated via other means (along with appropriate actions to be taken upon them) Test plan 1) Setup a rotation plan and add some items to it as per the manual 2) Run the stockrotation cronjob with the --execute flag 3) Check that the expected items appears in the new 'Transfers to send' page. It does not yet catch items that are due for transfer by any other means as at this time we do not store that sort of detail for other mechanisms. See bug 23092 for one proposed resolution to that. Signed-off-by: Martin Renvoize --- Koha/Item/Transfer.pm | 14 +++ Koha/Library.pm | 14 +++ Koha/StockRotationItem.pm | 43 +++++++ Koha/Util/StockRotation.pm | 11 +- circ/transferstosend.pl | 67 +++++++++++ .../prog/en/modules/circ/circulation-home.tt | 3 + .../prog/en/modules/circ/transferstosend.tt | 105 ++++++++++++++++++ 7 files changed, 249 insertions(+), 8 deletions(-) create mode 100755 circ/transferstosend.pl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/circ/transferstosend.tt diff --git a/Koha/Item/Transfer.pm b/Koha/Item/Transfer.pm index 50c381db39..e30fefa4a3 100644 --- a/Koha/Item/Transfer.pm +++ b/Koha/Item/Transfer.pm @@ -33,6 +33,20 @@ Koha::Item::Transfer - Koha Item Transfer Object class =cut +=head3 item + + my $item = Koha::Library->item; + +Returns the associated item for this transfer. + +=cut + +sub item { + my ( $self ) = @_; + my $rs = $self->_result->itemnumber; + return Koha::Item->_new_from_dbic( $rs ); +} + =head3 type =cut diff --git a/Koha/Library.pm b/Koha/Library.pm index dab86e7580..31480e833b 100644 --- a/Koha/Library.pm +++ b/Koha/Library.pm @@ -50,6 +50,20 @@ sub stockrotationstages { return Koha::StockRotationStages->_new_from_dbic( $rs ); } +=head3 outgoing_transfers + + my $outgoing_transfers = Koha::Library->outgoing_transfers; + +Returns the outgoing item transfers associated with this Library. + +=cut + +sub outgoing_transfers { + my ( $self ) = @_; + my $rs = $self->_result->branchtransfers_frombranches; + return Koha::Item::Transfers->_new_from_dbic( $rs ); +} + =head3 get_effective_marcorgcode my $marcorgcode = Koha::Libraries->find( $library_id )->get_effective_marcorgcode(); diff --git a/Koha/StockRotationItem.pm b/Koha/StockRotationItem.pm index e451bb08db..3db643a7c4 100644 --- a/Koha/StockRotationItem.pm +++ b/Koha/StockRotationItem.pm @@ -224,6 +224,49 @@ sub advance { return $transfer->store; } +=head3 toggle_indemand + + $sritem->toggle_indemand; + +Toggle this items in_demand status. + +If the item is in the process of being advanced to the next stage then we cancel +the transfer, revert the advancement and reset the 'StockrotationAdvance' counter, +as though 'in_demand' had been set prior to the call to advance, by updating the +in progress transfer. + +=cut + +sub toggle_indemand { + my ( $self ) = @_; + + # Toggle the item's indemand flag + my $new_indemand = ($self->indemand == 1) ? 0 : 1; + + # Cancel 'StockrotationAdvance' transfer if one is in progress + if ($new_indemand) { + my $item = $self->itemnumber; + my $transfer = $item->get_transfer; + if ($transfer && $transfer->comments eq 'StockrotationAdvance') { + my $stage = $self->stage; + my $new_stage; + if ( $stage->rota->cyclical && !$stage->first_sibling ) { # First stage + $new_stage = $stage->last_sibling; + } else { + $new_stage = $stage->previous_sibling; + } + $self->stage_id($new_stage->stage_id)->store; # Revert stage change + $item->homebranch($new_stage->branchcode_id)->store; # Revert update homebranch + $new_indemand = 0; # Reset indemand + $transfer->tobranch($new_stage->branchcode_id); # Reset StockrotationAdvance + $transfer->datearrived(DateTime->now); # Reset StockrotationAdvance + $transfer->store; + } + } + + $self->indemand($new_indemand)->store; +} + =head3 investigate my $report = $item->investigate; diff --git a/Koha/Util/StockRotation.pm b/Koha/Util/StockRotation.pm index 13c78e5675..9fb6a962fe 100644 --- a/Koha/Util/StockRotation.pm +++ b/Koha/Util/StockRotation.pm @@ -97,21 +97,16 @@ sub get_stages { sub toggle_indemand { - my ($item_id, $stage_id) = @_; + my ($item_id) = @_; # Get the item object - my $item = Koha::StockRotationItems->find( + my $sr_item = Koha::StockRotationItems->find( { itemnumber_id => $item_id, - stage_id => $stage_id } ); - # Toggle the item's indemand flag - my $new_indemand = ($item->indemand == 1) ? 0 : 1; - - $item->indemand($new_indemand)->store; - + $sr_item->toggle_indemand; } =head2 move_to_next_stage diff --git a/circ/transferstosend.pl b/circ/transferstosend.pl new file mode 100755 index 0000000000..3283d14365 --- /dev/null +++ b/circ/transferstosend.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl + +# Copyright 2019 PTFS-Europe Ltd. +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; +use CGI qw ( -utf8 ); +use C4::Context; +use C4::Auth; +use C4::Output; + +use Koha::DateUtils; + +my $input = new CGI; +my $itemnumber = $input->param('itemnumber'); + +my ( $template, $loggedinuser, $cookie, $flags ) = get_template_and_user( + { + template_name => "circ/transferstosend.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { circulate => "circulate_remaining_permissions" }, + debug => 1, + } +); + +# set the userenv branch +my $branchcode = C4::Context->userenv->{'branch'}; + +# transfers prompted by stockrotation +my @transfers = Koha::Libraries->search( + { + 'branchtransfers_frombranches.frombranch' => $branchcode, + 'branchtransfers_frombranches.datesent' => { '!=' => undef }, + 'branchtransfers_frombranches.datearrived' => undef, + 'branchtransfers_frombranches.comments' => + [ "StockrotationAdvance", "StockrotationRepatriation" ] + }, + { + prefetch => 'branchtransfers_frombranches', + order_by => 'branchtransfers_frombranches.frombranch' + } +); + +$template->param( + branchesloop => \@transfers, + show_date => output_pref( + { dt => dt_from_string, dateformat => 'iso', dateonly => 1 } + ) +); + +output_html_with_http_headers $input, $cookie, $template->output; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt index b1bac4ae2b..a5f5420f3c 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation-home.tt @@ -93,6 +93,9 @@ Transfer [% END %] +
  • + Transfers to send +
  • Transfers to receive
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/transferstosend.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/transferstosend.tt new file mode 100644 index 0000000000..ed80ef5a2b --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/transferstosend.tt @@ -0,0 +1,105 @@ +[% USE raw %] +[% USE Asset %] +[% USE Koha %] +[% USE KohaDates %] +[% USE Branches %] +[% SET footerjs = 1 %] +[% INCLUDE 'doc-head-open.inc' %] +Koha › Circulation › Transfers to send +[% INCLUDE 'doc-head-close.inc' %] + + + +[% INCLUDE 'header.inc' %] +[% INCLUDE 'circ-search.inc' %] + + + +
    +
    +
    +
    +
    + + [% IF Koha.Preference('CircSidebar') %] +
    + [% ELSE %] +
    + [% END %] + +

    Transfers required by your library as of [% show_date | $KohaDates %]

    + [% IF ( branchesloop ) %] +

    Your library is the origin for the following transfer(s)

    +
    + [% FOREACH branchesloo IN branchesloop %] + [% IF ( branchesloo.branchcode ) %] + + + + + + + + + + + [% FOREACH transfer IN branchesloo.outgoing_transfers %] + + + + + + + + + [% END %] +
    Sending to [% branchesloo.branchname | html %]
    Date of requestTitleOn hold forHome libraryCall no. 

    [% transfer.datesent | $KohaDates %]

    + [% INCLUDE 'biblio-default-view.inc' biblionumber = transfer.item.biblionumber %][% transfer.item.biblio.title | html %] [% IF ( transfer.item.biblio.subtitles ) %] [% FOREACH subtitle IN transfer.item.biblio.subtitles %][% subtitle.subfield | html %][% END %][% END %] [% IF ( transfer.item.biblio.author ) %]by [% transfer.item.biblio.author | html %][% END %] + [% IF ( transfer.item.effective_itemtype ) %] ([% transfer.item.effective_itemtype | html %])[% END %] +
    Barcode: [% transfer.item.barcode | html %] +

    None

    [% transfer.item.itemcallnumber | html %] + [% IF transfer.comments == 'StockrotationAdvance' %] + Mark "In demand" + [% END %] +
    + [% END %] + [% END %] +
    + [% ELSE %] +

    No transfers to send

    + [% END %] + + [% IF Koha.Preference('CircSidebar') %] +
    +
    + +
    +
    + [% END %] + +
    +
    +
    + +[% MACRO jsinclude BLOCK %] + [% INCLUDE 'datatables.inc' %] + +[% END %] + +[% INCLUDE 'intranet-bottom.inc' %] -- 2.20.1