Bug 5336: Order search (search and UI enhancements)

You can now search orders by

- order status
- fund

The patch series also adds a new field, aqorders.orderstatus, which can
contain following values:

  new
  ordered
  partial (for partially received orders)
  complete
  cancelled

To test: Search and check if results are consistent in histsearch.pl
Signed-off-by: Cedric Vita <cedric.vita@dracenie.com>

Signed-off-by: Pierre Angot <tredok.pierre@gmail.com>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
Comments on last patch.
Note: status are no longer numeric, but strings now.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
This commit is contained in:
Jonathan Druart 2012-01-18 16:05:40 +01:00 committed by Galen Charlton
parent d910cee85c
commit 8a2b3bc0c8
6 changed files with 238 additions and 63 deletions

View File

@ -28,7 +28,7 @@ use MARC::Record;
use C4::Suggestions;
use C4::Biblio;
use C4::Debug;
use C4::SQLHelper qw(InsertInTable);
use C4::SQLHelper qw(InsertInTable UpdateInTable);
use C4::Bookseller qw(GetBookSellerFromId);
use C4::Templates qw(gettemplate);
@ -43,7 +43,7 @@ BEGIN {
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(
&GetBasket &NewBasket &CloseBasket &DelBasket &ModBasket
&GetBasket &NewBasket &CloseBasket &ReopenBasket &DelBasket &ModBasket
&GetBasketAsCSV &GetBasketGroupAsCSV
&GetBasketsByBookseller &GetBasketsByBasketgroup
&GetBasketsInfosByBookseller
@ -77,6 +77,7 @@ BEGIN {
&GetItemnumbersFromOrder
&AddClaim
&GetBiblioCountByBasketno
);
}
@ -216,7 +217,7 @@ sub NewBasket {
&CloseBasket($basketno);
close a basket (becomes unmodifiable,except for recieves)
close a basket (becomes unmodifiable, except for receives)
=cut
@ -230,6 +231,48 @@ sub CloseBasket {
";
my $sth = $dbh->prepare($query);
$sth->execute($basketno);
my @orders = GetOrders($basketno);
foreach my $order (@orders) {
$query = qq{
UPDATE aqorders
SET orderstatus = 1
WHERE ordernumber = ?;
};
$sth = $dbh->prepare($query);
$sth->execute($order->{'ordernumber'});
}
}
=head3 ReopenBasket
&ReopenBasket($basketno);
reopen a basket
=cut
sub ReopenBasket {
my ($basketno) = @_;
my $dbh = C4::Context->dbh;
my $query = "
UPDATE aqbasket
SET closedate=NULL
WHERE basketno=?
";
my $sth = $dbh->prepare($query);
$sth->execute($basketno);
my @orders = GetOrders($basketno);
foreach my $order (@orders) {
$query = qq{
UPDATE aqorders
SET orderstatus = 0
WHERE ordernumber = ?;
};
$sth = $dbh->prepare($query);
$sth->execute($order->{'ordernumber'});
}
}
#------------------------------------------------------------#
@ -469,6 +512,7 @@ sub ModBasket {
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare($query);
$sth->execute(@params);
$sth->finish;
}
@ -1032,7 +1076,8 @@ The following keys are used: "biblionumber", "title", "basketno", "quantity", "n
sub NewOrder {
my $orderinfo = shift;
#### ------------------------------
my $parent_ordernumber = shift;
my $dbh = C4::Context->dbh;
my @params;
@ -1259,7 +1304,8 @@ sub ModReceiveOrder {
# (entirely received)
$sth=$dbh->prepare("
UPDATE aqorders
SET quantity = ?
SET quantity = ?,
orderstatus = 2
WHERE ordernumber = ?
");
@ -1288,7 +1334,7 @@ sub ModReceiveOrder {
} else {
$sth=$dbh->prepare("update aqorders
set quantityreceived=?,datereceived=?,invoiceid=?,
unitprice=?,rrp=?,ecost=?,budget_id=?
unitprice=?,rrp=?,ecost=?,budget_id=?,orderstatus=3
where biblionumber=? and ordernumber=?");
$sth->execute($quantrec,$datereceived,$invoiceid,$cost,$rrp,$ecost,$budget_id,$biblionumber,$ordernumber);
$sth->finish;
@ -1338,7 +1384,8 @@ sub CancelReceipt {
UPDATE aqorders
SET quantityreceived = ?,
datereceived = ?,
invoiceid = ?
invoiceid = ?,
orderstatus = 1
WHERE ordernumber = ?
};
$sth = $dbh->prepare($query);
@ -1365,7 +1412,8 @@ sub CancelReceipt {
}
$query = qq{
UPDATE aqorders
SET quantity = ?
SET quantity = ?,
orderstatus = 1
WHERE ordernumber = ?
};
$sth = $dbh->prepare($query);
@ -1545,7 +1593,7 @@ sub DelOrder {
my $dbh = C4::Context->dbh;
my $query = "
UPDATE aqorders
SET datecancellationprinted=now()
SET datecancellationprinted=now(), orderstatus=4
WHERE biblionumber=? AND ordernumber=?
";
my $sth = $dbh->prepare($query);
@ -1964,6 +2012,9 @@ sub GetHistory {
my $basket = $params{basket};
my $booksellerinvoicenumber = $params{booksellerinvoicenumber};
my $basketgroupname = $params{basketgroupname};
my $budget = $params{budget};
my $orderstatus = $params{orderstatus};
my @order_loop;
my $total_qty = 0;
my $total_qtyreceived = 0;
@ -1972,10 +2023,10 @@ sub GetHistory {
my $dbh = C4::Context->dbh;
my $query ="
SELECT
biblio.title,
biblio.author,
biblioitems.isbn,
biblioitems.ean,
COALESCE(biblio.title, deletedbiblio.title) AS title,
COALESCE(biblio.author, deletedbiblio.author) AS author,
COALESCE(biblioitems.isbn, deletedbiblioitems.isbn) AS isbn,
COALESCE(biblioitems.ean, deletedbiblioitems.ean) AS ean,
aqorders.basketno,
aqbasket.basketname,
aqbasket.basketgroupid,
@ -1990,19 +2041,32 @@ sub GetHistory {
aqorders.invoiceid,
aqinvoices.invoicenumber,
aqbooksellers.id as id,
aqorders.biblionumber
aqorders.biblionumber,
aqorders.orderstatus,
aqorders.parent_ordernumber,
aqbudgets.budget_name
";
$query .= ", aqbudgets.budget_id AS budget" if defined $budget;
$query .= "
FROM aqorders
LEFT JOIN aqbasket ON aqorders.basketno=aqbasket.basketno
LEFT JOIN aqbasketgroups ON aqbasket.basketgroupid=aqbasketgroups.id
LEFT JOIN aqbooksellers ON aqbasket.booksellerid=aqbooksellers.id
LEFT JOIN biblioitems ON biblioitems.biblionumber=aqorders.biblionumber
LEFT JOIN biblioitems ON biblioitems.biblionumber=aqorders.biblionumber
LEFT JOIN biblio ON biblio.biblionumber=aqorders.biblionumber
LEFT JOIN aqinvoices ON aqorders.invoiceid = aqinvoices.invoiceid";
LEFT JOIN aqbudgets ON aqorders.budget_id=aqbudgets.budget_id
LEFT JOIN aqinvoices ON aqorders.invoiceid = aqinvoices.invoiceid
LEFT JOIN deletedbiblio ON deletedbiblio.biblionumber=aqorders.biblionumber
LEFT JOIN deletedbiblioitems ON deletedbiblioitems.biblionumber=aqorders.biblionumber
";
$query .= " LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber"
if ( C4::Context->preference("IndependentBranches") );
if ( C4::Context->preference("IndependentBranches") ) {
$query .= " LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber";
}
$query .= " WHERE (datecancellationprinted is NULL or datecancellationprinted='0000-00-00') ";
$query .= " WHERE 1 ";
$query .= " AND (datecancellationprinted is NULL or datecancellationprinted='0000-00-00') " if $orderstatus ne '4';
my @query_params = ();
@ -2021,7 +2085,7 @@ sub GetHistory {
$query .= " AND biblioitems.isbn LIKE ? ";
push @query_params, "%$isbn%";
}
if ( defined $ean and $ean ) {
if ( $ean ) {
$query .= " AND biblioitems.ean = ? ";
push @query_params, "$ean";
}
@ -2030,6 +2094,11 @@ sub GetHistory {
push @query_params, "%$name%";
}
if ( $budget ) {
$query .= " AND aqbudgets.budget_id = ? ";
push @query_params, "$budget";
}
if ( $from_placed_on ) {
$query .= " AND creationdate >= ? ";
push @query_params, $from_placed_on;
@ -2040,6 +2109,11 @@ sub GetHistory {
push @query_params, $to_placed_on;
}
if ( defined $orderstatus and $orderstatus ne '') {
$query .= " AND aqorders.orderstatus = ? ";
push @query_params, "$orderstatus";
}
if ($basket) {
if ($basket =~ m/^\d+$/) {
$query .= " AND aqorders.basketno = ? ";
@ -2075,9 +2149,9 @@ sub GetHistory {
$line->{count} = $cnt++;
$line->{toggle} = 1 if $cnt % 2;
push @order_loop, $line;
$total_qty += $line->{'quantity'};
$total_qtyreceived += $line->{'quantityreceived'};
$total_price += $line->{'quantity'} * $line->{'ecost'};
$total_qty += ( $line->{quantity} ) ? $line->{quantity} : 0;
$total_qtyreceived += ( $line->{quantityreceived} ) ? $line->{quantityreceived} : 0;
$total_price += ( $line->{quantity} and $line->{ecost} ) ? $line->{quantity} * $line->{ecost} : 0;
}
return \@order_loop, $total_qty, $total_price, $total_qtyreceived;
}
@ -2601,6 +2675,31 @@ sub MergeInvoices {
return;
}
=head3 GetBiblioCountByBasketno
$biblio_count = &GetBiblioCountByBasketno($basketno);
Looks up the biblio's count that has basketno value $basketno
Returns a quantity
=cut
sub GetBiblioCountByBasketno {
my ($basketno) = @_;
my $dbh = C4::Context->dbh;
my $query = "
SELECT COUNT( DISTINCT( biblionumber ) )
FROM aqorders
WHERE basketno = ?
AND (datecancellationprinted IS NULL OR datecancellationprinted='0000-00-00')
";
my $sth = $dbh->prepare($query);
$sth->execute($basketno);
return $sth->fetchrow;
}
1;
__END__

View File

@ -177,18 +177,16 @@ if ( $op eq 'delete_confirm' ) {
}
exit;
} else {
$template->param(confirm_close => "1",
booksellerid => $booksellerid,
basketno => $basket->{'basketno'},
basketname => $basket->{'basketname'},
basketgroupname => $basket->{'basketname'});
$template->param(
confirm_close => "1",
booksellerid => $booksellerid,
basketno => $basket->{'basketno'},
basketname => $basket->{'basketname'},
basketgroupname => $basket->{'basketname'},
);
}
} elsif ($op eq 'reopen') {
my $basket;
$basket->{basketno} = $query->param('basketno');
$basket->{closedate} = undef;
ModBasket($basket);
ReopenBasket($query->param('basketno'));
print $query->redirect('/cgi-bin/koha/acqui/basket.pl?basketno='.$basket->{'basketno'})
} else {
# get librarian branch...

View File

@ -57,6 +57,8 @@ use C4::Output;
use C4::Acquisition;
use C4::Dates;
use C4::Debug;
use C4::Branch;
use C4::Koha;
my $input = new CGI;
my $title = $input->param( 'title');
@ -70,6 +72,9 @@ my $booksellerinvoicenumber = $input->param( 'booksellerinvoicenumber' );
my $do_search = $input->param('do_search') || 0;
my $from_placed_on = C4::Dates->new($input->param('from'));
my $to_placed_on = C4::Dates->new($input->param('to'));
my $budget = $input->param( 'budget' );
my $orderstatus = $input->param( 'orderstatus' );
if ( not $input->param('from') ) {
# FIXME Dirty but we can't sent a Date::Calc to C4::Dates ?
# We would use a function like Add_Delta_YM(-1, 0, 0);
@ -110,21 +115,33 @@ if ($do_search) {
basket => $basket,
booksellerinvoicenumber => $booksellerinvoicenumber,
basketgroupname => $basketgroupname,
budget => $budget,
orderstatus => $orderstatus,
);
}
my $from_date = $from_placed_on ? $from_placed_on->output('syspref') : undef;
my $to_date = $to_placed_on ? $to_placed_on->output('syspref') : undef;
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(
suggestions_loop => $order_loop,
order_loop => $order_loop,
total_qty => $total_qty,
total_qtyreceived => $total_qtyreceived,
total_price => sprintf( "%.2f", $total_price ),
numresults => $order_loop ? scalar(@$order_loop) : undef,
title => $title,
author => $author,
isbn => $isbn,
isbn => $isbn,
ean => $ean,
name => $name,
basket => $basket,
@ -132,6 +149,7 @@ $template->param(
basketgroupname => $basketgroupname,
from_placed_on => $from_date,
to_placed_on => $to_date,
bp_loop => $bp_loop,
debug => $debug || $input->param('debug') || 0,
uc(C4::Context->preference("marcflavour")) => 1
);

View File

@ -2937,6 +2937,7 @@ CREATE TABLE `aqorders` ( -- information related to the basket line items
`claimed_date` date default NULL, -- last date a claim was generated
`subscriptionid` int(11) default NULL, -- links this order line to a subscription (subscription.subscriptionid)
parent_ordernumber int(11) default NULL, -- ordernumber of parent order line, or same as ordernumber if no parent
`orderstatus` tinyint(2) default 0, -- the current status for this line item
PRIMARY KEY (`ordernumber`),
KEY `basketno` (`basketno`),
KEY `biblionumber` (`biblionumber`),

View File

@ -7306,6 +7306,18 @@ if ( CheckVersion($DBversion) ) {
SetVersion($DBversion);
}
$DBversion = "3.13.00.XXX";
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
my $return_count;
$dbh->do("ALTER TABLE aqorders ADD COLUMN orderstatus tinyint(2) DEFAULT 0 AFTER parent_ordernumber");
$dbh->do("UPDATE aqorders SET orderstatus=1 WHERE basketno IN (SELECT basketno FROM aqbasket WHERE closedate IS NOT NULL)");
$dbh->do("UPDATE aqorders SET orderstatus=2 WHERE quantity > quantityreceived AND quantityreceived > 0");
$dbh->do("UPDATE aqorders SET orderstatus=3 WHERE quantity=quantityreceived");
$dbh->do("UPDATE aqorders SET orderstatus=4 WHERE datecancellationprinted IS NOT NULL");
print "Upgrade to $DBversion done (Add category ORDRSTATUS values in authorised_values table)\n";
SetVersion($DBversion);
}
=head1 FUNCTIONS
=head2 TableExists($table)

View File

@ -1,6 +1,6 @@
[% USE KohaDates %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha &rsaquo; Acquisitions &rsaquo; [% IF ( suggestions_loop ) %]Orders search &rsaquo; Search results[% ELSE %]Order search[% END %]</title>
<title>Koha &rsaquo; Acquisitions &rsaquo; [% IF ( order_loop ) %]Orders search &rsaquo; Search results[% ELSE %]Order search[% END %]</title>
<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" />
[% INCLUDE 'doc-head-close.inc' %]
[% INCLUDE 'calendar.inc' %]
@ -22,7 +22,7 @@
[% INCLUDE 'header.inc' %]
[% INCLUDE 'acquisitions-search.inc' %]
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> &rsaquo; [% IF ( suggestions_loop ) %]<a href="/cgi-bin/koha/acqui/histsearch.pl">Orders search</a> &rsaquo; Search results[% ELSE %]Order search[% END %]</div>
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> &rsaquo; [% IF ( order_loop ) %]<a href="/cgi-bin/koha/acqui/histsearch.pl">Orders search</a> &rsaquo; Search results[% ELSE %]Order search[% END %]</div>
<div id="doc3" class="yui-t2">
@ -30,7 +30,7 @@
<div id="yui-main">
<div class="yui-b">
[% UNLESS ( suggestions_loop ) %]<form action="/cgi-bin/koha/acqui/histsearch.pl" method="post">
[% UNLESS ( order_loop ) %]<form action="/cgi-bin/koha/acqui/histsearch.pl" method="post">
<fieldset class="rows">
<legend>Search Orders</legend>
<ol>
@ -47,6 +47,35 @@
<label for="basketgroupname">Basket group:</label>
<input type="text" name="basketgroupname" id="basketgroupname" value="[% basketgroupname %]" />
</li>
<li>
<label for="orderstatus">Order Status: </label>
<select name="orderstatus" id="orderstatus">
<option value=""></option>
<option value="0">New</option>
<option value="1">Ordered</option>
<option value="2">Partial</option>
<option value="3">Complete</option>
<option value="4">Deleted</option>
</select>
</li>
<li>
<label for="fund">Fund: </label>
<select name="budget" id="fund">
<option value="">All funds</option>
[% FOREACH bp_loo IN bp_loop %]
<optgroup label="[% bp_loo.budget_period_description %]">
[% FOREACH h_loo IN bp_loo.hierarchy %]
<option type="text" value="[% h_loo.budget_id %]" branchcode="[% h_loo.budget_branchcode %]">
[% h_loo.budget_display_name %]
</option>
[% END %]
</optgroup>
[% END %]
</select>
</li>
<li><label for="from">From: </label>
<input type="text" size="10" id="from" name="from" value="[% from_placed_on %]" class="datepickerfrom" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
@ -60,11 +89,12 @@
<input type="hidden" name="do_search" value="1" />
<fieldset class="action"><input type="submit" value="Search" /></fieldset>
</form>[% END %]
[% IF ( suggestions_loop ) %]<h1>Search results</h1>
[% IF ( order_loop ) %]<h1>Search results</h1>
<div id="acqui_histsearch">
<table id="histsearcht">
<thead>
<tr>
<th>Order line</th>
<th>Basket</th>
<th>Basket group</th>
<th>Invoice number</th>
@ -73,41 +103,58 @@
<th>Vendor</th>
<th>Placed on</th>
<th>Received on</th>
<th>Quantity ordered</th>
<th>Status</th>
<th>Quantity received</th>
<th>Pending order</th>
<th>Unit cost</th>
<th>Fund</th>
</tr>
</thead>
<tbody>
[% FOREACH suggestions_loo IN suggestions_loop %]
<tr>
<td>[% suggestions_loo.basketname %] (<a href="basket.pl?basketno=[% suggestions_loo.basketno %]">[% suggestions_loo.basketno %]</a>)</td>
[% FOREACH order IN order_loop %]
<tr>
<td>[% order.parent_ordernumber %]</td>
<td>[% order.basketname %] (<a href="basket.pl?basketno=[% order.basketno %]">[% order.basketno %]</a>)</td>
<td>
[% IF ( suggestions_loo.basketgroupid ) %]
[% suggestions_loo.groupname %] (<a href="basketgroup.pl?booksellerid=[% suggestions_loo.id %]">[% suggestions_loo.basketgroupid %]</a>)
[% IF ( order.basketgroupid ) %]
[% order.groupname %] (<a href="basketgroup.pl?booksellerid=[% order.id %]">[% order.basketgroupid %]</a>)
[% ELSE %]
&nbsp;
[% END %]
</td>
<td>[% IF suggestions_loo.invoicenumber %]
<a href="/cgi-bin/koha/acqui/parcel.pl?invoiceid=[% suggestions_loo.invoiceid %]">[% suggestions_loo.invoicenumber %]</a>
[% ELSE %]
&nbsp;
[% END %]
</td>
<td>[% suggestions_loo.ordernumber %]</td>
<td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% suggestions_loo.biblionumber %]">[% suggestions_loo.title |html %]</a>
<br />[% suggestions_loo.author %] <br /> [% suggestions_loo.isbn %]</td>
<td><a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% suggestions_loo.id %]">[% suggestions_loo.name %]</a></td>
<td>[% suggestions_loo.creationdate | $KohaDates %]</td>
<td>
[% IF suggestions_loo.datereceived %]
[% suggestions_loo.datereceived | $KohaDates %]
<td>[% IF ( order.invoicenumber ) %]
<a href="/cgi-bin/koha/acqui/parcel.pl?invoiceid=[% order.invoiceid %]">[% order.invoicenumber %]</a>
[% ELSE %]
&nbsp;
[% END %]
</td>
<td>[% suggestions_loo.quantity %]</td>
<td>[% suggestions_loo.ecost %]</td>
</tr>
[% END %]
<td>[% order.ordernumber %]</td>
<td>
<a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% order.biblionumber %]">[% order.title |html %]</a>
<br />[% order.author %] <br /> [% order.isbn %]
</td>
<td><a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% order.id %]">[% order.name %]</a></td>
<td>[% order.creationdate | $KohaDates %]</td>
<td>
[% IF order.datereceived %]
[% order.datereceived | $KohaDates %]
[% END %]
</td>
<td>
[% SWITCH order.orderstatus %]
[% CASE '0' %]New
[% CASE '1' %]Ordered
[% CASE '2' %]Partial
[% CASE '3' %]Complete
[% CASE '4' %]Deleted
[% END %]
</td>
<td>[% order.quantityreceived %]</td>
<td>[% order.quantity %]</td>
<td>[% order.ecost %]</td>
<td>[% order.budget_name %]</td>
</tr>
[% END %]
</tbody>
</table>
</div>[% ELSE %][% END %]