Bug 7169: Change booksellers search results display

- Replace vendor table by a div (avoid table in a table)
- Add two columns in basket tables: biblio count and expected (not
  received) items)
- Replace tablesorter by datatables
- Add a list of all returned bookseller names in top of the page (easier
  to find a bookseller in a large list of results)
This commit is contained in:
Julian Maurice 2012-01-13 12:11:49 +01:00 committed by Paul Poulain
parent 9e11576caa
commit d09e428a7d
4 changed files with 169 additions and 109 deletions

View File

@ -44,6 +44,7 @@ BEGIN {
&GetBasket &NewBasket &CloseBasket &DelBasket &ModBasket
&GetBasketAsCSV
&GetBasketsByBookseller &GetBasketsByBasketgroup
&GetBasketsInfosByBookseller
&ModBasketHeader
@ -464,6 +465,39 @@ sub GetBasketsByBookseller {
return $results
}
=head3 GetBasketsInfosByBookseller
my $baskets = GetBasketsInfosByBookseller($supplierid);
Returns in a arrayref of hashref all about booksellers baskets, plus:
total_biblios: Number of distinct biblios in basket
total_items: Number of items in basket
expected_items: Number of non-received items in basket
=cut
sub GetBasketsInfosByBookseller {
my ($supplierid) = @_;
return unless $supplierid;
my $dbh = C4::Context->dbh;
my $query = qq{
SELECT aqbasket.*,
SUM(aqorders.quantity) AS total_items,
COUNT(DISTINCT aqorders.biblionumber) AS total_biblios,
SUM(IF(aqorders.datereceived IS NULL, aqorders.quantity, 0)) AS expected_items
FROM aqbasket
LEFT JOIN aqorders ON aqorders.basketno = aqbasket.basketno
WHERE booksellerid = ?
GROUP BY aqbasket.basketno
};
my $sth = $dbh->prepare($query);
$sth->execute($supplierid);
return $sth->fetchall_arrayref({});
}
#------------------------------------------------------------#
=head3 GetBasketsByBasketgroup

View File

@ -57,6 +57,7 @@ use C4::Output;
use CGI;
use C4::Dates qw/format_date/;
use C4::Acquisition qw/ GetBasketsInfosByBookseller /;
use C4::Bookseller qw/ GetBookSellerFromId GetBookSeller /;
use C4::Members qw/GetMember/;
use C4::Context;
@ -105,13 +106,18 @@ my $userbranch = $userenv->{branch};
my $loop_suppliers = [];
for my $vendor (@suppliers) {
my $baskets = get_vendors_baskets( $vendor->{id} );
my $baskets = GetBasketsInfosByBookseller( $vendor->{id} );
my $loop_basket = [];
for my $basket ( @{$baskets} ) {
my $authorisedby = $basket->{authorisedby};
my $basketbranch = ''; # set a blank branch to start with
my $member = GetMember( borrowernumber => $authorisedby );
if ( $member ) {
$basketbranch = $member->{branchcode};
}
if ($userenv->{'flags'} & 1 || #user is superlibrarian
(haspermission( $uid, { acquisition => q{*} } ) && #user has acq permissions and
($viewbaskets eq 'all' || #user is allowed to see all baskets
@ -125,6 +131,13 @@ for my $vendor (@suppliers) {
$basket->{$date_field} = format_date( $basket->{$date_field} );
}
}
foreach (qw(total_items total_biblios expected_items)) {
$basket->{$_} ||= 0;
}
if($member) {
$basket->{authorisedby_firstname} = $member->{firstname};
$basket->{authorisedby_surname} = $member->{surname};
}
push @{$loop_basket}, $basket;
}
}
@ -141,21 +154,7 @@ $template->param(
loop_suppliers => $loop_suppliers,
supplier => ( $booksellerid || $supplier ),
count => $supplier_count,
dateformat => C4::Context->preference('dateformat'),
);
output_html_with_http_headers $query, $cookie, $template->output;
sub get_vendors_baskets {
my $supplier_id = shift;
my $dbh = C4::Context->dbh;
my $sql = <<'ENDSQL';
select aqbasket.*, count(*) as total, borrowers.firstname, borrowers.surname
from aqbasket left join aqorders on aqorders.basketno = aqbasket.basketno
left join borrowers on aqbasket.authorisedby = borrowers.borrowernumber
where booksellerid = ?
AND ( aqorders.quantity > aqorders.quantityreceived OR quantityreceived IS NULL)
AND datecancellationprinted IS NULL
group by basketno
ENDSQL
return $dbh->selectall_arrayref( $sql, { Slice => {} }, $supplier_id );
}

View File

@ -2164,3 +2164,23 @@ a.localimage img {
div.pager p {
margin: 0;
}
div#acqui_order_supplierlist > div.supplier {
border: 1px solid #EEEEEE;
margin: 0.5em;
padding: 1em;
}
div#acqui_order_supplierlist > div.supplier > span.suppliername {
display: inline;
font-size: 1.7em;
margin-bottom: 0.5em;
}
div#acqui_order_supplierlist > div.supplier > span.action {
margin-left: 5em;
}
div#acqui_order_supplierlist > div.supplier > div.baskets {
margin-top: 0.5em;
}

View File

@ -6,19 +6,26 @@
vertical-align: top;
}
</style>
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
<link rel="stylesheet" href="[% themelang %]/css/datatables.css" />
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script>
[% INCLUDE 'datatables-strings.inc' %]
<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
$("#vendorst").tablesorter({
headers: {
3: {
sorter: false
}
}
});
});
//]]>
$(document).ready(function() {
[% IF (dateformat == 'metric') %]
dt_add_type_uk_date();
[% END %]
$("table.baskets").dataTable($.extend(true, {}, dataTablesDefaults, {
'bPaginate': false,
'bFilter': false,
'bInfo': false,
'aoColumnDefs': [
{ 'aTargets': [-1], 'bSortable': false }
]
}));
});
//]]>
</script>
</head>
@ -40,88 +47,88 @@
[% ELSE %]
<h1>You searched on <b>vendor [% supplier %],</b> [% count %] results found</h1>
[% END %]
[% IF ( loop_suppliers ) %]
<div id="acqui_order_supplierlist">
<table id="vendorst">
<thead>
<tr>
<th>Order</th>
<th>Order receive</th>
<th>Vendor</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
[% FOREACH loop_supplier IN loop_suppliers %]
[% UNLESS ( loop.odd ) %]
<tr class="highlight">
[% ELSE %]
<tr>
[% END %]
<td>[% IF ( CAN_user_acquisition_order_manage ) %]
[% IF ( loop_supplier.active ) %]
<a href="basketheader.pl?booksellerid=[% loop_supplier.booksellerid %]&amp;op=add_form">New basket</a>
[% ELSE %]
Inactive
[% END %]
[% END %]
</td>
<td> <a href="parcels.pl?booksellerid=[% loop_supplier.booksellerid %]">Receive shipment</a>
</td>
[% IF ( loop_supplier.name ) %]
<td><a href="supplier.pl?booksellerid=[% loop_supplier.booksellerid %]">[% loop_supplier.name %]</a></td>
[% ELSE %]
<td><a href="supplier.pl?booksellerid=[% loop_supplier.booksellerid %]">NO NAME</a></td>
[% END %]
<td> <table>
[% IF ( loop_supplier.loop_basket ) %]
<tr>
<th>Basket (#)</th>
<th>Items</th>
<th>Created by</th>
<th>Date</th>
<th>&nbsp;</th>
</tr>
[% FOREACH loop_baske IN loop_supplier.loop_basket %]
[% IF ( loop_baske.uncertainprices ) %]
<tr class="problem">
[% ELSE %]
[% UNLESS ( loop.odd ) %]
<tr class="highlight">
[% ELSE %]
<tr>
[% END %]
[% END %]
<td>[% loop_baske.basketname %] (#[% loop_baske.basketno %])</td>
<td>[% loop_baske.total %]</td>
<td> [% loop_baske.firstname %]
[% loop_baske.surname %]
</td>
<td>[% loop_baske.creationdate %]</td>
<td> [% IF ( loop_baske.closedate ) %]
closed on [% loop_baske.closedate %]
<a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% loop_baske.basketno %]">View</a>
[% ELSE %]
[% IF ( loop_baske.active ) %]
<a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% loop_baske.basketno %]">modify</a>
[% ELSE %]
<a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% loop_baske.basketno %]">View</a>
[% END %]
[% END %]
</td>
</tr>
[% END %]
[% ELSE %]
<tr><td>No pending baskets</td></tr>
[% END %]
</table>
</td>
</tr>
[% IF ( loop_suppliers.size ) %]
[% UNLESS (count == 1) %]
<ul class="suppliers_anchors">
[% FOREACH supplier IN loop_suppliers %]
<li><a href="#[% supplier.booksellerid %]">[% supplier.name %]</a></li>
[% END %]
</tbody>
</table>
</div>
</ul>
[% END %]
<div id="acqui_order_supplierlist">
[% FOREACH supplier IN loop_suppliers %]
<div class="supplier">
<span class="suppliername">
[% IF (supplier.name) %]
<a name="[% supplier.booksellerid %]" href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% supplier.booksellerid %]">[% supplier.name %]</a>
[% ELSE %]
<a name="[% supplier.booksellerid %]" href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% supplier.booksellerid %]">NO NAME</a>
[% END %]
</span>
<span class="action">
[% IF ( CAN_user_acquisition_order_manage ) %]
[% IF ( supplier.active ) %]
<input type="button" value="New basket" onclick="window.location.href='/cgi-bin/koha/acqui/basketheader.pl?booksellerid=[% supplier.booksellerid %]&op=add_form'" />
[% ELSE %]
(inactive)
[% END %]
[% END %]
<input type="button" value="Receive shipment" onclick="window.location.href='/cgi-bin/koha/acqui/parcels.pl?booksellerid=[% supplier.booksellerid %]'" />
</span>
<div class="baskets">
[% IF ( supplier.loop_basket.size ) %]
<table class="baskets">
<thead>
<tr>
<th>Basket (#)</th>
<th>Biblios</th>
<th>Items</th>
<th>Expected items</th>
<th>Created by</th>
<th>Date</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
[% FOREACH basket IN supplier.loop_basket %]
[% IF ( basket.uncertainprices ) %]
<tr class="problem">
[% ELSE %]
<tr>
[% END %]
<td>[% basket.basketname %] (#[% basket.basketno %])</td>
<td>[% basket.total_biblios %]</td>
<td>[% basket.total_items %]</td>
<td>[% basket.expected_items %]</td>
<td>
[% basket.authorisedby_firstname %]
[% basket.authorisedby_surname %]
</td>
<td>[% basket.creationdate %]</td>
<td>
[% IF ( basket.closedate ) %]
closed on [% basket.closedate %]
<a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% basket.basketno %]">View</a>
[% ELSE %]
[% IF ( basket.active ) %]
<a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% basket.basketno %]">Modify</a>
[% ELSE %]
<a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% basket.basketno %]">View</a>
[% END %]
[% END %]
</td>
</tr>
[% END %][%# FOREACH basket IN supplier.loop_basket %]
</tbody>
</table>
[% ELSE %]
<p>No pending baskets</p>
[% END %][%# IF ( supplier.loop_basket.size ) %]
</div>
</div>
[% END %][%# FOREACH supplier IN loop_suppliers %]
</div>
[% END %][%# IF ( loop_suppliers.size ) %]
</div>
</div>
<div class="yui-b">