Koha/Koha/Util/StockRotation.pm
Jonathan Druart 7d8b96803f
Bug 24545: Fix license statements
Bug 9978 should have fixed them all, but some were missing.
We want all the license statements part of Koha to be identical, and
using the GPLv3 statement.

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
2020-02-24 13:31:26 +00:00

247 lines
4.9 KiB
Perl

package Koha::Util::StockRotation;
# Module contains subroutines used with Stock Rotation
#
# Copyright 2016 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 <http://www.gnu.org/licenses>.
use Modern::Perl;
use Koha::Items;
use Koha::StockRotationItems;
use Koha::Database;
our ( @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS );
BEGIN {
require Exporter;
@ISA = qw( Exporter );
@EXPORT = qw( );
@EXPORT_OK = qw(
get_branches
get_stages
toggle_indemand
remove_from_stage
get_barcodes_status
add_items_to_rota
move_to_next_stage
);
%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
}
=head1 NAME
Koha::Util::StockRotation - utility class with routines for Stock Rotation
=head1 FUNCTIONS
=head2 get_branches
returns all branches ordered by branchname as an array, each element
contains a hashref containing branch details
=cut
sub get_branches {
return Koha::Libraries->search(
{},
{ order_by => ['branchname'] }
)->unblessed;
}
=head2 get_stages
returns an arrayref of StockRotationStage objects representing
all stages for a passed rota
=cut
sub get_stages {
my $rota = shift;
my @out = ();
if ($rota->stockrotationstages->count > 0) {
push @out, $rota->first_stage->unblessed;
push @out, @{$rota->first_stage->siblings->unblessed};
}
return \@out;
}
=head2 toggle_indemand
given an item's ID & stage ID toggle that item's in_demand
status on that stage
=cut
sub toggle_indemand {
my ($item_id, $stage_id) = @_;
# Get the item object
my $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;
}
=head2 move_to_next_stage
given an item's ID and stage ID, move it
to the next stage on the rota
=cut
sub move_to_next_stage {
my ($item_id, $stage_id) = shift;
# Get the item object
my $item = Koha::StockRotationItems->find(
{
itemnumber_id => $item_id,
stage_id => $stage_id
}
);
$item->advance;
}
=head2 remove_from_stage
given an item's ID & stage ID, remove that item from that stage
=cut
sub remove_from_stage {
my ($item_id, $stage_id) = @_;
# Get the item object and delete it
Koha::StockRotationItems->find(
{
itemnumber_id => $item_id,
stage_id => $stage_id
}
)->delete;
}
=head2 get_barcodes_status
take an arrayref of barcodes and a status hashref and populate it
=cut
sub get_barcodes_status {
my ($rota_id, $barcodes, $status) = @_;
# Get the items associated with these barcodes
my $items = Koha::Items->search(
{
barcode => { '-in' => $barcodes }
},
{
prefetch => 'stockrotationitem'
}
);
# Get an array of barcodes that were found
# Assign each barcode's status
my @found = ();
while (my $item = $items->next) {
push @found, $item->barcode if $item->barcode;
# Check if it's on a rota
my $on_rota = $item->stockrotationitem;
# It is on a rota
if ($on_rota) {
# Check if it's on this rota
if ($on_rota->stage->rota->rota_id == $rota_id) {
# It's on this rota
push @{$status->{on_this}}, $item;
} else {
# It's on another rota
push @{$status->{on_other}}, $item;
}
} else {
# Item is not on a rota
push @{$status->{ok}}, $item;
}
}
# Create an array of barcodes supplied in the file that
# were not found in the catalogue
my %found_in_cat = map{ $_ => 1 } @found;
push @{$status->{not_found}}, grep(
!defined $found_in_cat{$_}, @{$barcodes}
);
}
=head2 add_items_to_rota
take an arrayref of Koha::Item objects and add them to the passed rota
=cut
sub add_items_to_rota {
my ($rota_id, $items) = @_;
foreach my $item(@{$items}) {
$item->add_to_rota($rota_id);
}
}
1;
=head1 AUTHOR
Andrew Isherwood <andrew.isherwood@ptfs-europe.com>
=cut