Main Koha release repository
https://koha-community.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
4.7 KiB
242 lines
4.7 KiB
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) = @_;
|
|
|
|
# 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
|
|
|