Koha-clms/Koha/Util/StockRotation.pm

235 lines
4.6 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 <https://www.gnu.org/licenses>.
use Modern::Perl;
use base 'Exporter';
BEGIN {
our @EXPORT_OK = qw(
get_branches
get_stages
toggle_indemand
remove_from_stage
get_barcodes_status
add_items_to_rota
move_to_next_stage
);
our %EXPORT_TAGS = ( ALL => [@EXPORT_OK] );
}
use Koha::Items;
use Koha::StockRotationItems;
use Koha::Database;
=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) = @_;
# Get the item object
my $sr_item = Koha::StockRotationItems->find(
{
itemnumber_id => $item_id,
}
);
$sr_item->toggle_indemand;
}
=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