From 5ee1f7e4068b60f1bee6f7d11055b2a3b6223309 Mon Sep 17 00:00:00 2001 From: Julian Maurice <julian.maurice@biblibre.com> Date: Fri, 13 Jan 2012 12:11:49 +0100 Subject: [PATCH] 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) --- C4/Acquisition.pm | 34 ++++ acqui/booksellers.pl | 36 ++--- .../intranet-tmpl/prog/en/css/staff-global.css | 20 +++ .../prog/en/modules/acqui/booksellers.tt | 177 ++++++++++---------- 4 files changed, 161 insertions(+), 106 deletions(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index 0a96a02..75e7bab 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -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 diff --git a/acqui/booksellers.pl b/acqui/booksellers.pl index d7c64db..f41eb39 100755 --- a/acqui/booksellers.pl +++ b/acqui/booksellers.pl @@ -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,18 +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 - if ( GetMember( borrowernumber => $authorisedby ) ) { - # authorisedby may not be a valid borrowernumber; it's not foreign-key constrained! - $basketbranch = GetMember( borrowernumber => $authorisedby )->{branchcode}; + 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 @@ -130,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; } } @@ -146,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 ); -} diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css index fec66d6..6a0f607 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css +++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css @@ -2145,3 +2145,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; +} diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/booksellers.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/booksellers.tt index 1616261..26c15fc 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/booksellers.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/booksellers.tt @@ -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 ) %] +[% 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 %] + </ul> + [% END %] <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> + [% 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 %] - Inactive + <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 %] - </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 %] + <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> - [% 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> + <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 %] - <a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% loop_baske.basketno %]">View</a> + [% 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 %] - [% END %] - </td> - </tr> - [% END %] - [% ELSE %] - <tr><td>No pending baskets</td></tr> - [% END %] + </td> + </tr> + [% END %][%# FOREACH basket IN supplier.loop_basket %] + </tbody> </table> - </td> - </tr> - [% END %] - </tbody> - </table> - </div> - [% END %] + [% 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"> -- 1.7.9