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:
parent
9e11576caa
commit
d09e428a7d
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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> </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 %]&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> </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> </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">
|
||||
|
|
|
|||
Loading…
Reference in New Issue