(MT #1855) Make an Ajax+JSON search receiving orders
authorPaul Poulain <paul.poulain@biblibre.com>
Tue, 1 Sep 2009 13:00:54 +0000 (15:00 +0200)
committerHenri-Damien LAURENT <henridamien.laurent@biblibre.com>
Wed, 30 Sep 2009 09:30:30 +0000 (11:30 +0200)
This one, rewrite the SearchOrder function to deal with the
search receiving an order. It implement an AJAX+JSON orders search engine.

C4/Acquisition.pm
acqui/parcel.pl
koha-tmpl/intranet-tmpl/prog/en/lib/yui/json/json-min.js [new file with mode: 0644]
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/ajax.tmpl
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tmpl

index c4fc0ca..e446e2a 100644 (file)
@@ -1170,39 +1170,40 @@ C<@results> is an array of references-to-hash with the following keys:
 
 sub SearchOrder {
 #### -------- SearchOrder-------------------------------
-    my ($ordernumber, $search) = @_;
+    my ($ordernumber, $search, $supplierid, $basket) = @_;
 
-    if ($ordernumber) {
-        my $dbh = C4::Context->dbh;
-        my $query =
-            "SELECT *
-            FROM aqorders
-            LEFT JOIN biblio ON aqorders.biblionumber=biblio.biblionumber
-            LEFT JOIN biblioitems ON biblioitems.biblionumber=biblio.biblionumber
-            LEFT JOIN aqbasket ON aqorders.basketno = aqbasket.basketno
-                WHERE  ((datecancellationprinted is NULL)
-                AND (aqorders.ordernumber=?))";
-        my $sth = $dbh->prepare($query);
-        $sth->execute($ordernumber);
-        my $results = $sth->fetchall_arrayref({});
-        $sth->finish;
-        return $results;
-    } else {
-        my $dbh = C4::Context->dbh;
-        my $query =
+    my $dbh = C4::Context->dbh;
+    my @args = ();
+    my $query =
             "SELECT *
             FROM aqorders
             LEFT JOIN biblio ON aqorders.biblionumber=biblio.biblionumber
             LEFT JOIN biblioitems ON biblioitems.biblionumber=biblio.biblionumber
             LEFT JOIN aqbasket ON aqorders.basketno = aqbasket.basketno
-                WHERE  ((datecancellationprinted is NULL)
-                AND (biblio.title like ? OR biblioitems.isbn like ?))";
-        my $sth = $dbh->prepare($query);
-        $sth->execute("%$search%","%$search%");
-        my $results = $sth->fetchall_arrayref({});
-        $sth->finish;
-        return $results;
+                WHERE  (datecancellationprinted is NULL)";
+                
+    if($ordernumber){
+        $query .= " AND (aqorders.ordernumber=?)";
+        push @args, $ordernumber;
+    }
+    if($search){
+        $query .= " AND (biblio.title like ? OR biblio.author LIKE ? OR biblioitems.isbn like ?)";
+        push @args, ("%$search%","%$search%","%$search%");
+    }
+    if($supplierid){
+        $query .= "AND aqbasket.booksellerid = ?";
+        push @args, $supplierid;
     }
+    if($basket){
+        $query .= "AND aqorders.basketno = ?";
+        push @args, $basket;
+    }
+
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@args);
+    my $results = $sth->fetchall_arrayref({});
+    $sth->finish;
+    return $results;
 }
 
 #------------------------------------------------------------#
index 3a161eb..7b93a15 100755 (executable)
@@ -61,6 +61,7 @@ use C4::Items;
 use CGI;
 use C4::Output;
 use C4::Dates qw/format_date format_date_in_iso/;
+use JSON;
 
 use strict;
 
@@ -83,6 +84,47 @@ my $resultsperpage = $input->param('resultsperpage');
 $resultsperpage = 20 unless ($resultsperpage);
 $startfrom=0 unless ($startfrom);
 
+if($input->param('format') eq "json"){
+    my ($template, $loggedinuser, $cookie)
+        = get_template_and_user({template_name => "acqui/ajax.tmpl",
+                 query => $input,
+                                type => "intranet",
+                 authnotrequired => 0,
+                 flagsrequired => {acquisition => 'order_receive'},
+                 debug => 1,
+    });
+       
+    my @datas;
+    my $search   = $input->param('search') || '';
+    my $supplier = $input->param('supplierid') || '';
+    my $basketno = $input->param('basketno') || '';
+    my $orderno  = $input->param('orderno') || '';
+
+    my $orders = SearchOrder($orderno, $search, $supplier, $basketno);
+    foreach my $order (@$orders){
+        if($order->{quantityreceived} < $order->{quantity}){
+            my $data = {};
+            
+            $data->{basketno} = $order->{basketno};
+            $data->{ordernumber} = $order->{ordernumber};
+            $data->{title} = $order->{title};
+            $data->{author} = $order->{author};
+            $data->{biblionumber} = $order->{biblionumber};
+            $data->{freight} = $order->{freight};
+            $data->{quantrem} = $order->{quantity} - $order->{quantityreceived};
+            $data->{quantity} = $order->{quantity};
+            $data->{ecost} = $order->{ecost};
+            $data->{ordertotal} = sprintf("%.2f",$order->{ecost}*$order->{quantity});
+            push @datas, $data;
+        }
+    }
+    
+    my $json_text = to_json(\@datas);
+    $template->param(return => $json_text);
+    output_html_with_http_headers $input, $cookie, $template->output;
+    exit;
+}
+
 my ($template, $loggedinuser, $cookie)
     = get_template_and_user({template_name => "acqui/parcel.tmpl",
                  query => $input,
diff --git a/koha-tmpl/intranet-tmpl/prog/en/lib/yui/json/json-min.js b/koha-tmpl/intranet-tmpl/prog/en/lib/yui/json/json-min.js
new file mode 100644 (file)
index 0000000..574c0c0
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+YAHOO.lang.JSON=(function(){var l=YAHOO.lang,_UNICODE_EXCEPTIONS=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,_ESCAPES=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,_VALUES=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,_BRACKETS=/(?:^|:|,)(?:\s*\[)+/g,_INVALID=/^[\],:{}\s]*$/,_SPECIAL_CHARS=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,_CHARS={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};function _revive(data,reviver){var walk=function(o,key){var k,v,value=o[key];if(value&&typeof value==="object"){for(k in value){if(l.hasOwnProperty(value,k)){v=walk(value,k);if(v===undefined){delete value[k];}else{value[k]=v;}}}}return reviver.call(o,key,value);};return typeof reviver==="function"?walk({"":data},""):data;}function _char(c){if(!_CHARS[c]){_CHARS[c]="\\u"+("0000"+(+(c.charCodeAt(0))).toString(16)).slice(-4);}return _CHARS[c];}function _prepare(s){return s.replace(_UNICODE_EXCEPTIONS,_char);}function _isValid(str){return l.isString(str)&&_INVALID.test(str.replace(_ESCAPES,"@").replace(_VALUES,"]").replace(_BRACKETS,""));}function _string(s){return'"'+s.replace(_SPECIAL_CHARS,_char)+'"';}function _stringify(h,key,d,w,pstack){var o=typeof w==="function"?w.call(h,key,h[key]):h[key],i,len,j,k,v,isArray,a;if(o instanceof Date){o=l.JSON.dateToString(o);}else{if(o instanceof String||o instanceof Boolean||o instanceof Number){o=o.valueOf();}}switch(typeof o){case"string":return _string(o);case"number":return isFinite(o)?String(o):"null";case"boolean":return String(o);case"object":if(o===null){return"null";}for(i=pstack.length-1;i>=0;--i){if(pstack[i]===o){return"null";}}pstack[pstack.length]=o;a=[];isArray=l.isArray(o);if(d>0){if(isArray){for(i=o.length-1;i>=0;--i){a[i]=_stringify(o,i,d-1,w,pstack)||"null";}}else{j=0;if(l.isArray(w)){for(i=0,len=w.length;i<len;++i){k=w[i];v=_stringify(o,k,d-1,w,pstack);if(v){a[j++]=_string(k)+":"+v;}}}else{for(k in o){if(typeof k==="string"&&l.hasOwnProperty(o,k)){v=_stringify(o,k,d-1,w,pstack);if(v){a[j++]=_string(k)+":"+v;}}}}a.sort();}}pstack.pop();return isArray?"["+a.join(",")+"]":"{"+a.join(",")+"}";}return undefined;}return{isValid:function(s){return _isValid(_prepare(s));},parse:function(s,reviver){s=_prepare(s);if(_isValid(s)){return _revive(eval("("+s+")"),reviver);}throw new SyntaxError("parseJSON");},stringify:function(o,w,d){if(o!==undefined){if(l.isArray(w)){w=(function(a){var uniq=[],map={},v,i,j,len;for(i=0,j=0,len=a.length;i<len;++i){v=a[i];if(typeof v==="string"&&map[v]===undefined){uniq[(map[v]=j++)]=v;}}return uniq;})(w);}d=d>=0?d:1/0;return _stringify({"":o},"",d,w,[]);}return undefined;},dateToString:function(d){function _zeroPad(v){return v<10?"0"+v:v;}return d.getUTCFullYear()+"-"+_zeroPad(d.getUTCMonth()+1)+"-"+_zeroPad(d.getUTCDate())+"T"+_zeroPad(d.getUTCHours())+":"+_zeroPad(d.getUTCMinutes())+":"+_zeroPad(d.getUTCSeconds())+"Z";},stringToDate:function(str){if(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/.test(str)){var d=new Date();d.setUTCFullYear(RegExp.$1,(RegExp.$2|0)-1,RegExp.$3);d.setUTCHours(RegExp.$4,RegExp.$5,RegExp.$6);return d;}return str;}};})();YAHOO.register("json",YAHOO.lang.JSON,{version:"2.7.0",build:"1796"});
\ No newline at end of file
index 13b3f76..fa44f11 100644 (file)
@@ -1 +1 @@
-<!-- TMPL_IF name="return" --><!-- TMPL_VAR name="return" --><!--/TMPL_IF-->
+<!-- TMPL_IF name="return" --><!-- TMPL_VAR name="return" --><!--/TMPL_IF-->
\ No newline at end of file
index 1dfaee7..ffb9303 100644 (file)
@@ -3,6 +3,7 @@
             Receipt Summary for <!-- TMPL_VAR NAME="name" --> <!--TMPL_IF Name="invoice"-->Invoice <!-- TMPL_VAR NAME="invoice" --><!--/TMPL_IF --> on <!-- TMPL_VAR NAME="formatteddatereceived" --><!-- TMPL_ELSE -->Receive Orders from <!-- TMPL_VAR NAME="name" --><!-- /TMPL_IF --></title>
 <!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
 <!-- TMPL_INCLUDE NAME="greybox.inc" -->
+<script type="text/javascript" src="<!-- TMPL_VAR NAME="yuipath" -->/json/json-min.js"></script> 
 <script type="text/JavaScript" language="JavaScript">
 //<![CDATA[
 
     // Launch filtering
     function filter() {
 
-       var summaryStatus = jQuery.trim($("#summaryfilter").val());
+    var summaryStatus = jQuery.trim($("#summaryfilter").val());
        var basketStatus  = $("#basketfilter").val();
        var orderStatus   = $("#orderfilter").val();
 
        if (summaryStatus == '' && basketStatus == '' && orderStatus == '') { clearFilters(); return false; }
 
        var filtered = "table#pendingt tbody.filterclass tr";
-       var foundCount = 0;
 
        // We hide everything
        $("#nothingfoundrow").remove();
        $(filtered).hide();
 
-       // Then show what matches the filters
-       if (summaryStatus != '') {
-           // Case-insensitive search for a substring
-           $(filtered + " td.summaryfilterclass:icontains(" + summaryStatus + ")").parent().show();
-           foundCount += $(filtered + " td.summaryfilterclass:icontains(" + summaryStatus + ")").length;
+       // Do the search
+       var callback =  {
+               success: function(o) {
+                       var jsonString = o.responseText;
+                       var gst = "<!-- TMPL_VAR NAME="gst" -->";
+                       try { 
+                               var orders = YAHOO.lang.JSON.parse(jsonString);
+                               var foundCount = orders.length;
+
+                               for( i = 0 ; i < orders.length ; i++){
+                                       order = orders[i];
+                                       $('<tr>'
+                       + '<td class="basketfilterclass"><a href="/cgi-bin/koha/acqui/basket.pl?basketno=' + order.basketno + '">' + order.basketno + '</a></td>'
+                       + '<td class="orderfilterclass"> ' + order.ordernumber + ' </td>'
+                       + '<td class="summaryfilterclass">'
+                       + '<a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=' + order.biblionumber + '">' + order.title + '</a> / ' + order.author + '&ndash;' + order.isbn + '</td>'
+                       + '<td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=' + order.biblionumber + '" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&amp;id=' + order.biblionumber + '" title="MARC" rel="gb_page_center[600,500]">Card</a></td>'
+                       + '<td>' + order.quantrem + ' / ' + order.quantity + '</td>'
+                       + '<td>' + order.ecost + '</td>'
+                       + '<td>' + order.ordertotal + '</td>'
+                       + '<td>'
+                       + '<a href="orderreceive.pl?ordernumber=' + order.ordernumber + '&amp;datereceived=<!-- TMPL_VAR NAME="invoicedatereceived" -->&amp;invoice=<!-- TMPL_VAR NAME="invoice" -->&amp;gst=' + gst + '&amp;freight=' + order.freight + '&amp;supplierid=<!-- TMPL_VAR NAME="supplierid" -->">Receive</a> /' 
+                       + '<a href="parcel.pl?type=intra&amp;ordernumber=' + order.ordernumber + '&amp;biblionumber=' + order.biblionumber + '&amp;action=cancelorder&amp;supplierid=<!-- TMPL_VAR NAME="supplierid" -->&amp;datereceived=<!-- TMPL_VAR NAME="invoicedatereceived" -->&amp;invoice=<!-- TMPL_VAR NAME="invoice" -->" onclick="return confirm(' + _('Are you sure you want to cancel this order?') + ');">Cancel</a>'
+                       + '</td></tr>').appendTo("table#pendingt");
+                               }
+
+                               // If nothing has been found, we tell the user so
+                               if (orders.length == 0) {
+                                   $("<tr><td id=\"nothingfoundrow\" colspan=\"8\">No items match your criteria.<\/tr>").appendTo("table#pendingt");
+                               }
+                       }catch(e){alert(e);}
+               }
        }
+       var transaction = YAHOO.util.Connect.asyncRequest('GET', '/cgi-bin/koha/acqui/parcel.pl?supplierid=<!-- TMPL_VAR NAME="supplierid" -->&search='+summaryStatus+'&basketno='+basketStatus+'&orderno='+orderStatus+'&format=json', callback, null);
 
-       if (basketStatus != '') {
-           // Exact search
-           $(filtered + " td.basketfilterclass:containsExactly(" + basketStatus + ")").parent().show();
-           foundCount += $(filtered + " td.basketfilterclass:containsExactly(" + basketStatus + ")").length;
-       }
-
-       if (orderStatus != '') {
-           // Exact search
-           $(filtered + " td.orderfilterclass:containsExactly(" + orderStatus + ")").parent().show();
-           foundCount += $(filtered + " td.orderfilterclass:containsExactly(" + orderStatus + ")").length;
-       }
-
-       // If nothing has been found, we tell the user so
-       if (foundCount == 0) {
-           $("<tr><td id=\"nothingfoundrow\" colspan=\"8\">No items match your criteria.<\/tr>").appendTo("table#pendingt");
-       }
+       return false;
     }
     
     // Clear already applied filters
 </div>
 <div id="acqui_receive_search">
     <h2>Items in shipment</h2>
-        <form action="/cgi-bin/koha/acqui/parcel.pl" id="filterform" onsubmit="filter(); return false;">
+        <form action="/cgi-bin/koha/acqui/parcel.pl" id="filterform" onsubmit="return filter();">
         <fieldset class="rows">
 
             <legend>Filters :</legend>