Bug 7169: Change booksellers search results display
authorJulian Maurice <julian.maurice@biblibre.com>
Fri, 13 Jan 2012 11:11:49 +0000 (12:11 +0100)
committerPaul Poulain <paul.poulain@biblibre.com>
Wed, 21 Mar 2012 16:53:57 +0000 (17:53 +0100)
- 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
acqui/booksellers.pl
koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/booksellers.tt

index 15a68ea..4fd5cc2 100644 (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
index ac3c557..f1fa9f3 100755 (executable)
@@ -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 );
-}
index 78dd4f9..469f631 100644 (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;
+}
index 1616261..26c15fc 100644 (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>
 [% 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>&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>
+        [% 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>&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 %]
+                    <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>&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 %]
-                                                <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">