Koha/acqui/parcels.pl
Jared Camins-Esakov 2d47b85692 Bug 10366: Alert librarian if an invoice number is duplicated
Some vendors ship materials from the same invoice in multiple packages.
In those cases, it would be good to notify the librarian when they enter
a duplicate invoice number, so that they can continue receiving on the
previously-created invoice, rather than creating an invoice with a
duplicate number.

To test:
1) Apply patch and run database update.
2) Make sure that you have created at least one invoice on
   acqui/parcels.pl and take note of the invoice number.
3) Try to create an invoice with the same invoice number.
4) Note that without changing your configuration this works exactly
   the same as before.
5) Turn on the AcqWarnOnDuplicateInvoice system preference.
6) Try to create a new invoice with the same number as the one you
   noted earlier.
7) Make sure you get a warning about a duplicate invoice.
8) Choose to receive on the existing invoice.
9) Confirm that you are receiving on said existing invoice.
10) Start the receiving process over, and this time choose "Create new
    invoice anyway."
11) Confirm that you are now receiving on a new invoice.

Signed-off-by: Srdjan <srdjan@catalyst.net.nz>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Passes all tests and QA script.

I have followed the test plan, but also checked some more things:
- Checking the duplicate check works when you have the entered
  invoice number in your database multiple times already.
- Checking that no duplicate message is shown if you enter the
  invoice number and it's already been used for an invoice from
  another vendor.

Looks all good. I think the only thing we could argue about here
is if this could be activated by default for new installations.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
2013-07-06 17:13:45 +00:00

243 lines
7.2 KiB
Perl
Executable file

#!/usr/bin/perl
#script to show display basket of orders
# Copyright 2000-2002 Katipo Communications
# Copyright 2008-2009 BibLibre SARL
#
# 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 2 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, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
=head1 NAME
parcels.pl
=head1 DESCRIPTION
This script shows all orders/parcels receipt or pending for a given supplier.
It allows to write an order/parcels as 'received' when he arrives.
=head1 CGI PARAMETERS
=over 4
=item booksellerid
To know the supplier this script has to show orders.
=item orderby
sort list of order by 'orderby'.
Orderby can be equals to
* datereceived desc (default value)
* invoicenumber
* datereceived
* invoicenumber desc
=item filter
=item datefrom
To filter on date
=item dateto
To filter on date
=item resultsperpage
To know how many results have to be display / page.
=back
=cut
use strict;
use warnings;
use CGI;
use C4::Auth;
use C4::Output;
use C4::Dates qw/format_date/;
use C4::Acquisition;
use C4::Bookseller qw/ GetBookSellerFromId /;
use C4::Budgets;
my $input = CGI->new;
my $booksellerid = $input->param('booksellerid');
my $order = $input->param('orderby') || 'shipmentdate desc';
my $startfrom = $input->param('startfrom');
my $code = $input->param('filter');
my $datefrom = $input->param('datefrom');
my $dateto = $input->param('dateto');
my $resultsperpage = $input->param('resultsperpage');
my $op = $input->param('op');
$resultsperpage ||= 20;
our ( $template, $loggedinuser, $cookie, $flags ) = get_template_and_user(
{ template_name => 'acqui/parcels.tmpl',
query => $input,
type => 'intranet',
authnotrequired => 0,
flagsrequired => { acquisition => 'order_receive' },
debug => 1,
}
);
my $invoicenumber = $input->param('invoice');
my $shipmentdate = $input->param('shipmentdate');
my $shipmentcost = $input->param('shipmentcost');
my $shipmentcost_budgetid = $input->param('shipmentcost_budgetid');
if($shipmentdate) {
$shipmentdate = C4::Dates->new($shipmentdate)->output('iso');
}
if ( $op and $op eq 'new' ) {
if ( C4::Context->preference('AcqWarnOnDuplicateInvoice') ) {
my @invoices = GetInvoices(
supplierid => $booksellerid,
invoicenumber => $invoicenumber,
);
if ( $#invoices > 0 ) {
$template->{'VARS'}->{'duplicate_invoices'} = \@invoices;
$template->{'VARS'}->{'invoicenumber'} = $invoicenumber;
$template->{'VARS'}->{'shipmentdate'} = $shipmentdate;
$template->{'VARS'}->{'shipmentcost'} = $shipmentcost;
$template->{'VARS'}->{'shipmentcost_budgetid'} =
$shipmentcost_budgetid;
}
}
$op = 'confirm' unless $template->{'VARS'}->{'duplicate_invoices'};
}
if ($op and $op eq 'confirm') {
my $invoiceid = AddInvoice(
invoicenumber => $invoicenumber,
booksellerid => $booksellerid,
shipmentdate => $shipmentdate,
shipmentcost => $shipmentcost,
shipmentcost_budgetid => $shipmentcost_budgetid,
);
if(defined $invoiceid) {
# Successful 'Add'
print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid");
exit 0;
} else {
$template->param(error_failed_to_create_invoice => 1);
}
}
my $bookseller = GetBookSellerFromId($booksellerid);
my @parcels = GetInvoices(
supplierid => $booksellerid,
invoicenumber => $code,
shipmentdatefrom => $datefrom,
shipmentdateto => $dateto,
order_by => $order
);
my $count_parcels = @parcels;
# multi page display gestion
$startfrom ||= 0;
if ( $count_parcels > $resultsperpage ) {
set_page_navigation( $count_parcels, $startfrom, $resultsperpage );
}
my $loopres = [];
my $next_page_start = $startfrom + $resultsperpage;
my $last_row = ( $next_page_start < $count_parcels ) ? $next_page_start - 1 : $count_parcels - 1;
for my $i ( $startfrom .. $last_row) {
my $p = $parcels[$i];
push @{$loopres},
{ number => $i + 1,
invoiceid => $p->{invoiceid},
code => $p->{invoicenumber},
nullcode => $p->{invoicenumber} eq 'NULL',
emptycode => $p->{invoicenumber} eq q{},
raw_datereceived => $p->{shipmentdate},
datereceived => format_date( $p->{shipmentdate} ),
bibcount => $p->{receivedbiblios} || 0,
reccount => $p->{receiveditems} || 0,
itemcount => $p->{itemsexpected} || 0,
};
}
if ($count_parcels) {
$template->param( searchresults => $loopres, count => $count_parcels );
}
my $budgets = GetBudgets();
my @budgets_loop;
foreach my $budget (@$budgets) {
next unless CanUserUseBudget($loggedinuser, $budget, $flags);
push @budgets_loop, $budget;
}
$template->param(
orderby => $order,
filter => $code,
datefrom => $datefrom,
dateto => $dateto,
resultsperpage => $resultsperpage,
name => $bookseller->{'name'},
shipmentdate_today => C4::Dates->new()->output(),
booksellerid => $booksellerid,
GST => C4::Context->preference('gist'),
budgets => \@budgets_loop,
);
output_html_with_http_headers $input, $cookie, $template->output;
sub set_page_navigation {
my ( $total_rows, $startfrom, $resultsperpage ) = @_;
my $displaynext = 0;
my $displayprev = $startfrom;
my $next_row = $startfrom + $resultsperpage;
my $prev_row = $startfrom - $resultsperpage;
if ( $total_rows - $next_row > 0 ) {
$displaynext = 1;
}
# set up index numbers for paging
my $numbers = [];
if ( $total_rows > $resultsperpage ) {
my $pages = $total_rows / $resultsperpage;
if ( $total_rows % $resultsperpage ) {
++$pages;
}
# set up page indexes for at max 15 pages
my $max_idx = ( $pages < 15 ) ? $pages : 15;
my $current_page = ( $startfrom / $resultsperpage ) - 1;
for my $idx ( 1 .. $max_idx ) {
push @{$numbers},
{ number => $idx,
startfrom => ( $idx - 1 ) * $resultsperpage,
highlight => ( $idx == $current_page ),
};
}
}
$template->param(
numbers => $numbers,
displaynext => $displaynext,
displayprev => $displayprev,
nextstartfrom => ( ( $next_row < $total_rows ) ? $next_row : $total_rows ),
prevstartfrom => ( ( $prev_row > 0 ) ? $prev_row : 0 )
);
return;
}