Koha/acqui/duplicate_orders.pl
Nick Clemens 4f3b4dae27
Bug 24733: created_by param should be an arrayref
We allow for the user to add multiple users to this field, and the
search function expects and array. We have been treating it as a scalar

TO test:
1 - Have an open basket in acquisitions
2 - Add to basket - from an existing order (copy)
3 - Enter a name in the 'Basket created by' field and select a user
4 - Hit search
5 - ISE (Can't use string ("1") as an ARRAY ref while "strict refs" in use at /usr/share/koha/lib/C4/Acquisition.pm line 2482.)
6 - Apply patch
7 - Repeat 1-4
8 - Success!
9 - Test with mutiple 'created by' entries as well

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
2020-02-26 20:38:46 +00:00

178 lines
6.3 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2018 Koha Development Team
#
# 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 CGI qw ( -utf8 );
use C4::Auth;
use C4::Output;
use C4::Acquisition qw(GetHistory);
use C4::Budgets qw(GetBudgetPeriods GetBudgetHierarchy CanUserUseBudget);
use Koha::Acquisition::Baskets;
use Koha::Acquisition::Currencies;
use Koha::Acquisition::Orders;
use Koha::DateUtils qw(dt_from_string output_pref);
my $input = new CGI;
my $basketno = $input->param('basketno');
my $op = $input->param('op') || 'search'; # search, select, batch_edit
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
{
template_name => "acqui/duplicate_orders.tt",
query => $input,
type => "intranet",
authnotrequired => 0,
flagsrequired => { acquisition => 'order_manage' },
}
);
my $basket = Koha::Acquisition::Baskets->find($basketno);
output_and_exit( $input, $cookie, $template, 'unknown_basket' )
unless $basket;
my $vendor = $basket->bookseller;
my $patron = Koha::Patrons->find($loggedinuser)->unblessed;
my $filters = {
basket => scalar $input->param('basket'),
title => scalar $input->param('title'),
author => scalar $input->param('author'),
isbn => scalar $input->param('isbn'),
name => scalar $input->param('name'),
ean => scalar $input->param('ean'),
basketgroupname => scalar $input->param('basketgroupname'),
booksellerinvoicenumber => scalar $input->param('booksellerinvoicenumber'),
budget => scalar $input->param('budget'),
orderstatus => scalar $input->param('orderstatus'),
ordernumber => scalar $input->param('ordernumber'),
search_children_too => scalar $input->param('search_children_too'),
created_by => [$input->multi_param('created_by')]
};
my $from_placed_on =
eval { dt_from_string( scalar $input->param('from') ) } || dt_from_string;
my $to_placed_on =
eval { dt_from_string( scalar $input->param('to') ) } || dt_from_string;
unless ( $input->param('from') ) {
# Fill the form with year-1
$from_placed_on->set_time_zone('floating')->subtract( years => 1 );
}
$filters->{from_placed_on} =
output_pref( { dt => $from_placed_on, dateformat => 'iso', dateonly => 1 } ),
$filters->{to_placed_on} =
output_pref( { dt => $to_placed_on, dateformat => 'iso', dateonly => 1 } ),
my ( @result_order_loop, @selected_order_loop );
my @ordernumbers = split ',', scalar $input->param('ordernumbers') || '';
if ( $op eq 'select' ) {
@result_order_loop = map {
my $order = $_;
( grep {$_ eq $order->{ordernumber}} @ordernumbers ) ? () : $order
} @{ C4::Acquisition::GetHistory(%$filters) };
@selected_order_loop =
scalar @ordernumbers
? @{ C4::Acquisition::GetHistory( ordernumbers => \@ordernumbers ) }
: ();
}
elsif ( $op eq 'batch_edit' ) {
@ordernumbers = $input->multi_param('ordernumber');
# build budget list
my $budget_loop = [];
my $budgets_hierarchy = GetBudgetHierarchy;
foreach my $r ( @{$budgets_hierarchy} ) {
next
unless ( C4::Budgets::CanUserUseBudget( $patron, $r, $userflags ) );
if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) {
next;
}
push @{$budget_loop},
{
b_id => $r->{budget_id},
b_txt => $r->{budget_name},
b_code => $r->{budget_code},
b_sort1_authcat => $r->{'sort1_authcat'},
b_sort2_authcat => $r->{'sort2_authcat'},
b_active => $r->{budget_period_active},
};
}
@{$budget_loop} =
sort { uc( $a->{b_txt} ) cmp uc( $b->{b_txt} ) } @{$budget_loop};
my @currencies = Koha::Acquisition::Currencies->search;
$template->param(
currencies => \@currencies,
budget_loop => $budget_loop,
);
}
elsif ( $op eq 'do_duplicate' ) {
my @fields_to_copy = $input->multi_param('copy_existing_value');
my $default_values;
for my $field (
qw(currency budget_id order_internalnote order_vendornote sort1 sort2 ))
{
next if grep { $_ eq $field } @fields_to_copy;
$default_values->{$field} = $input->param("all_$field");
}
@ordernumbers = $input->multi_param('ordernumber');
my @new_ordernumbers;
for my $ordernumber (@ordernumbers) {
my $original_order = Koha::Acquisition::Orders->find($ordernumber);
next unless $original_order;
my $new_order =
$original_order->duplicate_to( $basket, $default_values );
push @new_ordernumbers, $new_order->ordernumber;
}
my $new_orders =
C4::Acquisition::GetHistory( ordernumbers => \@new_ordernumbers );
$template->param( new_orders => $new_orders );
$op = 'duplication_done';
}
my $budgetperiods = C4::Budgets::GetBudgetPeriods;
my $bp_loop = $budgetperiods;
for my $bp ( @{$budgetperiods} ) {
my $hierarchy = C4::Budgets::GetBudgetHierarchy( $$bp{budget_period_id} );
for my $budget ( @{$hierarchy} ) {
$$budget{budget_display_name} =
sprintf( "%s", ">" x $$budget{depth} . $$budget{budget_name} );
}
$$bp{hierarchy} = $hierarchy;
}
$template->param(
basket => $basket,
vendor => $vendor,
filters => $filters,
result_order_loop => \@result_order_loop,
selected_order_loop => \@selected_order_loop,
bp_loop => $bp_loop,
ordernumbers => \@ordernumbers,
op => $op,
);
output_html_with_http_headers $input, $cookie, $template->output;