(bug #3726) fix ISBD url translation
[koha.git] / C4 / Acquisition.pm
index 3854177..b3cd99c 100644 (file)
@@ -17,21 +17,33 @@ package C4::Acquisition;
 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 # Suite 330, Boston, MA  02111-1307 USA
 
+
 use strict;
-require Exporter;
 use C4::Context;
-use C4::Date;
+use C4::Debug;
+use C4::Dates qw(format_date);
 use MARC::Record;
 use C4::Suggestions;
-
-# use C4::Biblio;
+use Time::localtime;
 
 use vars qw($VERSION @ISA @EXPORT);
 
-# set the version for version checking
-$VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); };
+BEGIN {
+       # set the version for version checking
+       $VERSION = 3.01;
+       require Exporter;
+       @ISA    = qw(Exporter);
+       @EXPORT = qw(
+               &GetBasket &NewBasket &CloseBasket
+               &GetPendingOrders &GetOrder &GetOrders
+               &GetOrderNumber &GetLateOrders &NewOrder &DelOrder
+               &SearchOrder &GetHistory &GetRecentAcqui
+               &ModOrder &ModReceiveOrder &ModOrderBiblioNumber
+               &GetParcels &GetParcel
+       );
+}
 
-# used in reciveorder subroutine
+# used in receiveorder subroutine
 # to provide library specific handling
 my $library_name = C4::Context->preference("LibraryName");
 
@@ -41,157 +53,322 @@ C4::Acquisition - Koha functions for dealing with orders and acquisitions
 
 =head1 SYNOPSIS
 
-  use C4::Acquisition;
+use C4::Acquisition;
 
 =head1 DESCRIPTION
 
 The functions in this module deal with acquisitions, managing book
-orders, converting money to different currencies, and so forth.
+orders, basket and parcels.
 
 =head1 FUNCTIONS
 
-=over 2
+=head2 FUNCTIONS ABOUT BASKETS
+
+=head3 GetBasket
+
+=over 4
+
+$aqbasket = &GetBasket($basketnumber);
+
+get all basket informations in aqbasket for a given basket
+
+return :
+informations for a given basket returned as a hashref.
+
+=back
 
 =cut
 
-@ISA    = qw(Exporter);
-@EXPORT = qw(
-  &getbasket &getbasketcontent &newbasket &closebasket
-
-  &getorders &getallorders &getrecorders
-  &getorder &neworder &delorder
-  &ordersearch &histsearch
-  &modorder &getsingleorder &invoice &receiveorder
-  &updaterecorder &newordernum
-  &getsupplierlistwithlateorders
-  &getlateorders
-  &getparcels &getparcelinformation
-  &bookfunds &curconvert &getcurrencies &bookfundbreakdown
-  &updatecurrencies &getcurrency
-  &updatesup &insertsup
-  &bookseller &breakdown
-);
+sub GetBasket {
+    my ($basketno) = @_;
+    my $dbh        = C4::Context->dbh;
+    my $query = "
+        SELECT  aqbasket.*,
+                concat( b.firstname,' ',b.surname) AS authorisedbyname,
+                b.branchcode AS branch
+        FROM    aqbasket
+        LEFT JOIN borrowers b ON aqbasket.authorisedby=b.borrowernumber
+        WHERE basketno=?
+    ";
+    my $sth=$dbh->prepare($query);
+    $sth->execute($basketno);
+    my $basket = $sth->fetchrow_hashref;
+       return ( $basket );
+}
+
+#------------------------------------------------------------#
 
-#
-#
-#
-# BASKETS
-#
-#
-#
+=head3 NewBasket
 
-=item getbasket
+=over 4
 
-  $aqbasket = &getbasket($basketnumber);
+$basket = &NewBasket();
+
+Create a new basket in aqbasket table
+
+=back
+
+=cut
+
+# FIXME : this function seems to be unused.
+
+sub NewBasket {
+    my ( $booksellerid, $authorisedby ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $query = "
+        INSERT INTO aqbasket
+                (creationdate,booksellerid,authorisedby)
+        VALUES  (now(),'$booksellerid','$authorisedby')
+    ";
+    my $sth =
+      $dbh->do($query);
+
+#find & return basketno MYSQL dependant, but $dbh->last_insert_id always returns null :-(
+    my $basket = $dbh->{'mysql_insertid'};
+    return $basket;
+}
+
+#------------------------------------------------------------#
+
+=head3 CloseBasket
+
+=over 4
+
+&CloseBasket($basketno);
+
+close a basket (becomes unmodifiable,except for recieves)
+
+=back
 
-get all basket informations in aqbasket for a given basket
 =cut
 
-sub getbasket {
+sub CloseBasket {
     my ($basketno) = @_;
     my $dbh        = C4::Context->dbh;
-    my $sth        =
-      $dbh->prepare(
-"select aqbasket.*,borrowers.firstname+' '+borrowers.surname as authorisedbyname, borrowers.branchcode as branch from aqbasket left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber where basketno=?"
-      );
+    my $query = "
+        UPDATE aqbasket
+        SET    closedate=now()
+        WHERE  basketno=?
+    ";
+    my $sth = $dbh->prepare($query);
     $sth->execute($basketno);
-    return ( $sth->fetchrow_hashref );
-    $sth->finish();
 }
 
-=item getbasketcontent
+#------------------------------------------------------------#
+
+=head2 FUNCTIONS ABOUT ORDERS
+
+=cut
+
+#------------------------------------------------------------#
+
+=head3 GetPendingOrders
+
+=over 4
+
+$orders = &GetPendingOrders($booksellerid, $grouped);
+
+Finds pending orders from the bookseller with the given ID. Ignores
+completed and cancelled orders.
+
+C<$orders> is a reference-to-array; each element is a
+reference-to-hash with the following fields:
+C<$grouped> is a boolean that, if set to 1 will group all order lines of the same basket
+in a single result line 
+
+=over 2
+
+=item C<authorizedby>
+
+=item C<entrydate>
+
+=item C<basketno>
+
+These give the value of the corresponding field in the aqorders table
+of the Koha database.
+
+=back
+
+=back
+
+Results are ordered from most to least recent.
+
+=cut
+
+sub GetPendingOrders {
+    my ($supplierid,$grouped, $closed) = @_;
+    my $dbh = C4::Context->dbh;
+    my $strsth = "
+        SELECT    ".($grouped?"count(*),":"")."aqbasket.basketno,
+                    surname,firstname,aqorders.*,
+                    aqbasket.closedate, aqbasket.creationdate
+        FROM      aqorders
+        LEFT JOIN aqbasket ON aqbasket.basketno=aqorders.basketno
+        LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber
+        WHERE booksellerid=?
+            AND datecancellationprinted IS NULL
+            AND (to_days(now())-to_days(closedate) < 180 OR closedate IS NULL)
+    ";
+    if($closed){
+        $strsth .= "
+        AND (quantity > quantityreceived OR quantityreceived is NULL) 
+        AND closedate IS NOT NULL ";
+    }
+    ## FIXME  Why 180 days ???
+    my @query_params = ( $supplierid );
+    if ( C4::Context->preference("IndependantBranches") ) {
+        my $userenv = C4::Context->userenv;
+        if ( ($userenv) && ( $userenv->{flags} != 1 ) ) {
+            $strsth .= " and (borrowers.branchcode = ?
+                          or borrowers.branchcode  = '')";
+            push @query_params, $userenv->{branch};
+        }
+    }
+    $strsth .= " group by aqbasket.basketno" if $grouped;
+    $strsth .= " order by aqbasket.basketno";
+
+    my $sth = $dbh->prepare($strsth);
+    $sth->execute( @query_params );
+    my $results = $sth->fetchall_arrayref({});
+    $sth->finish;
+    return $results;
+}
+
+#------------------------------------------------------------#
+
+=head3 GetOrders
+
+=over 4
 
-  ($count, @orders) = &getbasketcontent($basketnumber, $booksellerID);
+@orders = &GetOrders($basketnumber, $orderby);
 
 Looks up the pending (non-cancelled) orders with the given basket
 number. If C<$booksellerID> is non-empty, only orders from that seller
 are returned.
 
+return :
 C<&basket> returns a two-element array. C<@orders> is an array of
 references-to-hash, whose keys are the fields from the aqorders,
-biblio, and biblioitems tables in the Koha database. C<$count> is the
-number of elements in C<@orders>.
+biblio, and biblioitems tables in the Koha database.
+
+=back
 
 =cut
 
-#'
-sub getbasketcontent {
-    my ( $basketno, $supplier, $orderby ) = @_;
+sub GetOrders {
+    my ( $basketno, $orderby ) = @_;
     my $dbh   = C4::Context->dbh;
-    my $query =
-"SELECT aqorderbreakdown.*,biblio.*,biblioitems.*,aqorders.*,biblio.title FROM aqorders,biblio,biblioitems
-       LEFT JOIN aqorderbreakdown ON aqorderbreakdown.ordernumber=aqorders.ordernumber
-       where basketno=?
-       AND biblio.biblionumber=aqorders.biblionumber AND biblioitems.biblioitemnumber
-       =aqorders.biblioitemnumber
-       AND (datecancellationprinted IS NULL OR datecancellationprinted =
-       '0000-00-00')";
-    if ( $supplier ne '' ) {
-        $query .= " AND aqorders.booksellerid=?";
-    }
-
-    $orderby = "biblioitems.publishercode" unless $orderby;
+    my $query  ="
+         SELECT  aqorderbreakdown.*,
+                biblio.*,biblioitems.*,
+                aqorders.*,
+                aqbookfund.bookfundname,
+                biblio.title
+        FROM    aqorders
+            LEFT JOIN aqorderbreakdown ON aqorders.ordernumber=aqorderbreakdown.ordernumber
+            LEFT JOIN aqbookfund       ON aqbookfund.bookfundid=aqorderbreakdown.bookfundid
+            LEFT JOIN biblio           ON biblio.biblionumber=aqorders.biblionumber
+            LEFT JOIN biblioitems      ON biblioitems.biblionumber=biblio.biblionumber
+        WHERE   basketno=?
+            AND (datecancellationprinted IS NULL OR datecancellationprinted='0000-00-00')
+    ";
+
+    $orderby = "biblioitems.publishercode,biblio.title" unless $orderby;
     $query .= " ORDER BY $orderby";
     my $sth = $dbh->prepare($query);
-    if ( $supplier ne '' ) {
-        $sth->execute( $basketno, $supplier );
-    }
-    else {
-        $sth->execute($basketno);
-    }
+    $sth->execute($basketno);
     my @results;
 
-    #  print $query;
-    my $i = 0;
     while ( my $data = $sth->fetchrow_hashref ) {
-        $results[$i] = $data;
-        $i++;
+        push @results, $data;
     }
     $sth->finish;
-    return ( $i, @results );
+    return @results;
 }
 
-=item newbasket
+#------------------------------------------------------------#
 
-  $basket = &newbasket();
+=head3 GetOrderNumber
 
-Create a new basket in aqbasket table
-=cut
+=over 4
 
-sub newbasket {
-    my ( $booksellerid, $authorisedby ) = @_;
+$ordernumber = &GetOrderNumber($biblioitemnumber, $biblionumber);
+
+=back
+
+Looks up the ordernumber with the given biblionumber and biblioitemnumber.
+
+Returns the number of this order.
+
+=over 4
+
+=item C<$ordernumber> is the order number.
+
+=back
+
+=cut
+sub GetOrderNumber {
+    my ( $biblionumber,$biblioitemnumber ) = @_;
     my $dbh = C4::Context->dbh;
-    my $sth =
-      $dbh->do(
-"insert into aqbasket (creationdate,booksellerid,authorisedby) values(now(),'$booksellerid','$authorisedby')"
-      );
+    my $query = "
+        SELECT ordernumber
+        FROM   aqorders
+        WHERE  biblionumber=?
+        AND    biblioitemnumber=?
+    ";
+    my $sth = $dbh->prepare($query);
+    $sth->execute( $biblionumber, $biblioitemnumber );
 
-#find & return basketno MYSQL dependant, but $dbh->last_insert_id always returns null :-(
-    my $basket = $dbh->{'mysql_insertid'};
-    return ($basket);
+    return $sth->fetchrow;
 }
 
-=item closebasket
+#------------------------------------------------------------#
+
+=head3 GetOrder
+
+=over 4
+
+$order = &GetOrder($ordernumber);
+
+Looks up an order by order number.
+
+Returns a reference-to-hash describing the order. The keys of
+C<$order> are fields from the biblio, biblioitems, aqorders, and
+aqorderbreakdown tables of the Koha database.
 
-  &newbasket($basketno);
+=back
 
-close a basket (becomes unmodifiable,except for recieves
 =cut
 
-sub closebasket {
-    my ($basketno) = @_;
-    my $dbh        = C4::Context->dbh;
-    my $sth        =
-      $dbh->prepare("update aqbasket set closedate=now() where basketno=?");
-    $sth->execute($basketno);
+sub GetOrder {
+    my ($ordnum) = @_;
+    my $dbh      = C4::Context->dbh;
+    my $query = "
+        SELECT biblioitems.*, biblio.*, aqorderbreakdown.*, aqorders.*
+        FROM   aqorders
+        LEFT JOIN aqorderbreakdown ON aqorders.ordernumber=aqorderbreakdown.ordernumber
+        LEFT JOIN biblio on           biblio.biblionumber=aqorders.biblionumber
+        LEFT JOIN biblioitems on       biblioitems.biblionumber=aqorders.biblionumber
+        WHERE aqorders.ordernumber=?
+
+    ";
+    my $sth= $dbh->prepare($query);
+    $sth->execute($ordnum);
+    my $data = $sth->fetchrow_hashref;
+    $sth->finish;
+    return $data;
 }
 
-=item neworder
+#------------------------------------------------------------#
 
-  &neworder($basket, $biblionumber, $title, $quantity, $listprice,
-       $booksellerid, $who, $notes, $bookfund, $biblioitemnumber, $rrp,
-       $ecost, $gst, $budget, $unitprice, $subscription,
-       $booksellerinvoicenumber);
+=head3 NewOrder
+
+=over 4
+
+  &NewOrder($basket, $biblionumber, $title, $quantity, $listprice,
+    $booksellerid, $who, $notes, $bookfund, $biblioitemnumber, $rrp,
+    $ecost, $gst, $budget, $unitprice, $subscription,
+    $booksellerinvoicenumber, $purchaseorder, $branchcode);
 
 Adds a new order to the database. Any argument that isn't described
 below is the new value of the field with the same name in the aqorders
@@ -204,94 +381,97 @@ entry to the aqorderbreakdown table, with the order number just found,
 and the book fund ID of the newly-added order.
 
 C<$budget> is effectively ignored.
+  If it's undef (anything false) or the string 'now', the current day is used.
+  Else, the upcoming July 1st is used.
 
 C<$subscription> may be either "yes", or anything else for "no".
 
+=back
+
 =cut
 
-#'
-sub neworder {
-    my (
+sub NewOrder {
+   my (
         $basketno,  $bibnum,       $title,        $quantity,
         $listprice, $booksellerid, $authorisedby, $notes,
         $bookfund,  $bibitemnum,   $rrp,          $ecost,
         $gst,       $budget,       $cost,         $sub,
-        $invoice,   $sort1,        $sort2
+        $invoice,   $sort1,        $sort2,        $purchaseorder,
+               $branchcode
       )
       = @_;
-    my $sth;
-    my $dbh;
+
+    my $year  = localtime->year() + 1900;
+    my $month = localtime->mon() + 1;       # months starts at 0, add 1
+
     if ( !$budget || $budget eq 'now' ) {
-        $sth = $dbh->prepare(
-            "INSERT INTO aqorders
-  (biblionumber,title,basketno,quantity,listprice,notes,
-      biblioitemnumber,rrp,ecost,gst,unitprice,subscription,sort1,sort2,budgetdate,entrydate)
-  VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,now(),now() )"
-        );
-        $sth->execute(
-            $bibnum, $title,      $basketno, $quantity, $listprice,
-            $notes,  $bibitemnum, $rrp,      $ecost,    $gst,
-            $cost,   $sub,        $sort1,    $sort2
-        );
+        $budget = undef;
+    }
+
+    # if month is july or more, budget start is 1 jul, next year.
+    elsif ( $month >= '7' ) {
+        ++$year;                            # add 1 to year , coz its next year
+        $budget = "$year-07-01";
     }
     else {
 
-        ##FIXME HARDCODED DATE.
-        $budget = "'2006-07-01'";
-        $sth    = $dbh->prepare(
-            "INSERT INTO aqorders
-  (biblionumber,title,basketno,quantity,listprice,notes,
-      biblioitemnumber,rrp,ecost,gst,unitprice,subscription,sort1,sort2,budgetdate,entrydate)
-  VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,now() )"
-        );
-        $sth->execute(
-            $bibnum, $title,      $basketno, $quantity, $listprice,
-            $notes,  $bibitemnum, $rrp,      $ecost,    $gst,
-            $cost,   $sub,        $sort1,    $sort2,    $budget
-        );
+        # START OF NEW BUDGET, 1ST OF JULY, THIS YEAR
+        $budget = "$year-07-01";
+    }
+
+    if ( $sub eq 'yes' ) {
+        $sub = 1;
+    }
+    else {
+        $sub = 0;
+    }
 
+    # if $basket empty, it's also a new basket, create it
+    unless ($basketno) {
+        $basketno = NewBasket( $booksellerid, $authorisedby );
     }
+
+    my $dbh = C4::Context->dbh;
+    my $query = "
+        INSERT INTO aqorders
+           ( biblionumber, title,            basketno, quantity, listprice,
+             notes,        biblioitemnumber, rrp,      ecost,    gst,
+             unitprice,    subscription,     sort1,    sort2,    budgetdate,
+             entrydate,    purchaseordernumber)
+        VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,COALESCE(?,NOW()),NOW(),? )
+    ";
+    my $sth = $dbh->prepare($query);
+
+    $sth->execute(
+        $bibnum, $title,      $basketno, $quantity, $listprice,
+        $notes,  $bibitemnum, $rrp,      $ecost,    $gst,
+        $cost,   $sub,        $sort1,    $sort2,    $budget,
+                 $purchaseorder
+    );
     $sth->finish;
 
     #get ordnum MYSQL dependant, but $dbh->last_insert_id returns null
     my $ordnum = $dbh->{'mysql_insertid'};
-    $sth = $dbh->prepare(
-        "INSERT INTO aqorderbreakdown (ordernumber,bookfundid) VALUES
-       (?,?)"
-    );
-    $sth->execute( $ordnum, $bookfund );
+    $query = "
+        INSERT INTO aqorderbreakdown (ordernumber,bookfundid, branchcode)
+        VALUES (?,?,?)
+    ";
+    $sth = $dbh->prepare($query);
+    $sth->execute( $ordnum, $bookfund, $branchcode );
     $sth->finish;
-    return $basketno;
+    return ( $basketno, $ordnum );
 }
 
-=item delorder
-
-  &delorder($biblionumber, $ordernumber);
-
-Cancel the order with the given order and biblio numbers. It does not
-delete any entries in the aqorders table, it merely marks them as
-cancelled.
-
-=cut
+#------------------------------------------------------------#
 
-#'
-sub delorder {
-    my ( $bibnum, $ordnum ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare(
-        "update aqorders set datecancellationprinted=now()
-  where biblionumber=? and ordernumber=?"
-    );
-    $sth->execute( $bibnum, $ordnum );
-    $sth->finish;
-}
+=head3 ModOrder
 
-=item modorder
+=over 4
 
-  &modorder($title, $ordernumber, $quantity, $listprice,
-       $biblionumber, $basketno, $supplier, $who, $notes,
-       $bookfundid, $bibitemnum, $rrp, $ecost, $gst, $budget,
-       $unitprice, $booksellerinvoicenumber);
+&ModOrder($title, $ordernumber, $quantity, $listprice,
+    $biblionumber, $basketno, $supplier, $who, $notes,
+    $bookfundid, $bibitemnum, $rrp, $ecost, $gst, $budget,
+    $unitprice, $booksellerinvoicenumber, $branchcode);
 
 Modifies an existing order. Updates the order with order number
 C<$ordernumber> and biblionumber C<$biblionumber>. All other arguments
@@ -299,726 +479,704 @@ update the fields with the same name in the aqorders table of the Koha
 database.
 
 Entries with order number C<$ordernumber> in the aqorderbreakdown
-table are also updated to the new book fund ID.
+table are also updated to the new book fund ID or branchcode.
+
+=back
 
 =cut
 
-#'
-sub modorder {
+sub ModOrder {
     my (
         $title,      $ordnum,   $quantity, $listprice, $bibnum,
         $basketno,   $supplier, $who,      $notes,     $bookfund,
         $bibitemnum, $rrp,      $ecost,    $gst,       $budget,
-        $cost,       $invoice,  $sort1,    $sort2
+        $cost,       $invoice,  $sort1,    $sort2,     $purchaseorder, $branchcode
       )
       = @_;
+ # FIXME : Refactor to pass a hashref instead of fifty params.
     my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare(
-        "update aqorders set title=?,
-  quantity=?,listprice=?,basketno=?,
-  rrp=?,ecost=?,unitprice=?,booksellerinvoicenumber=?,
-  notes=?,sort1=?, sort2=?
-  where
-  ordernumber=? and biblionumber=?"
-    );
+    my $query = "
+        UPDATE aqorders
+        SET    title=?,
+               quantity=?,listprice=?,basketno=?,
+               rrp=?,ecost=?,unitprice=?,booksellerinvoicenumber=?,
+               notes=?,sort1=?, sort2=?, purchaseordernumber=?
+        WHERE  ordernumber=? AND biblionumber=?
+    ";
+    my $sth = $dbh->prepare($query);
     $sth->execute(
         $title, $quantity, $listprice, $basketno, $rrp,
         $ecost, $cost,     $invoice,   $notes,    $sort1,
-        $sort2, $ordnum,   $bibnum
+        $sort2, $purchaseorder,
+               $ordnum,   $bibnum
     );
     $sth->finish;
-    $sth = $dbh->prepare(
-        "update aqorderbreakdown set bookfundid=? where
-  ordernumber=?"
-    );
-
-    unless ( $sth->execute( $bookfund, $ordnum ) )
-    {    # zero rows affected [Bug 734]
-        my $query =
-          "insert into aqorderbreakdown (ordernumber,bookfundid) values (?,?)";
+    $query = "
+        UPDATE aqorderbreakdown
+        SET    bookfundid=?,branchcode=?
+        WHERE  ordernumber=?
+    ";
+    $sth = $dbh->prepare($query);
+
+    my $rv = $sth->execute( $bookfund,$branchcode, $ordnum );
+    unless($rv && ( $rv ne '0E0' ))   {    # zero rows affected [Bug 734]
+        my $query ="
+            INSERT INTO aqorderbreakdown
+                     (ordernumber,branchcode,bookfundid)
+            VALUES   (?,?,?)
+        ";
         $sth = $dbh->prepare($query);
-        $sth->execute( $ordnum, $bookfund );
+        $sth->execute( $ordnum,$branchcode, $bookfund );
     }
     $sth->finish;
 }
 
-=item newordernum
+#------------------------------------------------------------#
+
+=head3 ModOrderBiblioNumber
+
+=over 4
+
+&ModOrderBiblioNumber($biblioitemnumber,$ordnum, $biblionumber);
 
-  $order = &newordernum();
+Modifies the biblioitemnumber for an existing order.
+Updates the order with order number C<$ordernum> and biblionumber C<$biblionumber>.
 
-Finds the next unused order number in the aqorders table of the Koha
-database, and returns it.
+=back
 
 =cut
 
-#'
-# FIXME - Race condition
-sub newordernum {
+sub ModOrderBiblioNumber {
+    my ($biblioitemnumber,$ordnum, $biblionumber) = @_;
     my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("Select max(ordernumber) from aqorders");
-    $sth->execute;
-    my $data   = $sth->fetchrow_arrayref;
-    my $ordnum = $$data[0];
-    $ordnum++;
-    $sth->finish;
-    return ($ordnum);
+    my $query = "
+      UPDATE aqorders
+      SET    biblioitemnumber = ?
+      WHERE  ordernumber = ?
+      AND biblionumber =  ?";
+    my $sth = $dbh->prepare($query);
+    $sth->execute( $biblioitemnumber, $ordnum, $biblionumber );
 }
 
-=item receiveorder
+#------------------------------------------------------------#
+
+=head3 ModReceiveOrder
+
+=over 4
 
-  &receiveorder($biblionumber, $ordernumber, $quantityreceived, $user,
-       $unitprice, $booksellerinvoicenumber, $biblioitemnumber,
-       $freight, $bookfund, $rrp);
+&ModReceiveOrder($biblionumber, $ordernumber, $quantityreceived, $user,
+    $unitprice, $booksellerinvoicenumber, $biblioitemnumber,
+    $freight, $bookfund, $rrp);
 
 Updates an order, to reflect the fact that it was received, at least
 in part. All arguments not mentioned below update the fields with the
 same name in the aqorders table of the Koha database.
 
+If a partial order is received, splits the order into two.  The received
+portion must have a booksellerinvoicenumber.  
+
 Updates the order with bibilionumber C<$biblionumber> and ordernumber
 C<$ordernumber>.
 
 Also updates the book fund ID in the aqorderbreakdown table.
 
+=back
+
 =cut
 
-#'
-sub receiveorder {
-    my ( $biblio, $ordnum, $quantrec, $user, $cost, $invoiceno, $freight, $rrp, $bookfund)
+
+sub ModReceiveOrder {
+    my (
+        $biblionumber,    $ordnum,  $quantrec, $user, $cost,
+        $invoiceno, $freight, $rrp, $bookfund, $datereceived
+      )
       = @_;
     my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare(
-"update aqorders set quantityreceived=?,datereceived=now(),booksellerinvoicenumber=?,
-                                                                                       unitprice=?,freight=?,rrp=?
-                                                       where biblionumber=? and ordernumber=?"
-    );
-    my $suggestionid = findsuggestion_from_biblionumber( $dbh, $biblio );
+#     warn "DATE BEFORE : $daterecieved";
+#    $daterecieved=POSIX::strftime("%Y-%m-%d",CORE::localtime) unless $daterecieved;
+#     warn "DATE REC : $daterecieved";
+       $datereceived = C4::Dates->output('iso') unless $datereceived;
+    my $suggestionid = GetSuggestionFromBiblionumber( $dbh, $biblionumber );
     if ($suggestionid) {
-        changestatus( $suggestionid, 'AVAILABLE', '', $biblio );
+        ModStatus( $suggestionid, 'AVAILABLE', '', $biblionumber );
     }
-    $sth->execute( $quantrec, $invoiceno, $cost, $freight, $rrp, $biblio,
-        $ordnum );
-    $sth->finish;
-
     # Allows libraries to change their bookfund during receiving orders
     # allows them to adjust budgets
-    if ( C4::Context->preferene("LooseBudgets") ) {
-        my $sth = $dbh->prepare(
-"UPDATE aqorderbreakdown SET bookfundid=?
-                           WHERE ordernumber=?"
-        );
+    if ( C4::Context->preference("LooseBudgets") && $bookfund ) {
+        my $query = "
+            UPDATE aqorderbreakdown
+            SET    bookfundid=?
+            WHERE  ordernumber=?
+        ";
+        my $sth = $dbh->prepare($query);
         $sth->execute( $bookfund, $ordnum );
         $sth->finish;
     }
+   
+       my $sth=$dbh->prepare("SELECT * FROM aqorders  LEFT JOIN aqorderbreakdown ON aqorders.ordernumber=aqorderbreakdown.ordernumber
+                                                       WHERE biblionumber=? AND aqorders.ordernumber=?");
+    $sth->execute($biblionumber,$ordnum);
+    my $order = $sth->fetchrow_hashref();
+    $sth->finish();
+       
+       if ( $order->{quantity} > $quantrec ) {
+        $sth=$dbh->prepare("update aqorders 
+                                                       set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?, 
+                                                               unitprice=?,freight=?,rrp=?,quantity=?
+                            where biblionumber=? and ordernumber=?");
+        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$quantrec,$biblionumber,$ordnum);
+        $sth->finish;
+        # create a new order for the remaining items, and set its bookfund.
+        my $newOrder = NewOrder($order->{'basketno'},$order->{'biblionumber'},$order->{'title'}, $order->{'quantity'} - $quantrec,    
+                    $order->{'listprice'},$order->{'booksellerid'},$order->{'authorisedby'},$order->{'notes'},   
+                    $order->{'bookfundid'},$order->{'biblioitemnumber'},$order->{'rrp'},$order->{'ecost'},$order->{'gst'},
+                    $order->{'budget'},$order->{'unitcost'},$order->{'sub'},'',$order->{'sort1'},$order->{'sort2'},$order->{'purchaseordernumber'});
+  } else {
+        $sth=$dbh->prepare("update aqorders 
+                                                       set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?, 
+                                                               unitprice=?,freight=?,rrp=?
+                            where biblionumber=? and ordernumber=?");
+        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordnum);
+        $sth->finish;
+    }
+    return $datereceived;
 }
+#------------------------------------------------------------#
 
-=item updaterecorder
-
-  &updaterecorder($biblionumber, $ordernumber, $user, $unitprice,
-       $bookfundid, $rrp);
-
-Updates the order with biblionumber C<$biblionumber> and order number
-C<$ordernumber>. C<$bookfundid> is the new value for the book fund ID
-in the aqorderbreakdown table of the Koha database. All other
-arguments update the fields with the same name in the aqorders table.
-
-C<$user> is ignored.
-
-=cut
-
-#'
-sub updaterecorder {
-    my ( $biblio, $ordnum, $user, $cost, $bookfund, $rrp ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare(
-        "update aqorders set
-  unitprice=?, rrp=?
-  where biblionumber=? and ordernumber=?
-  "
-    );
-    $sth->execute( $cost, $rrp, $biblio, $ordnum );
-    $sth->finish;
-    $sth =
-      $dbh->prepare(
-        "update aqorderbreakdown set bookfundid=? where ordernumber=?");
-    $sth->execute( $bookfund, $ordnum );
-    $sth->finish;
-}
-
-#
-#
-# ORDERS
-#
-#
+=head3 SearchOrder
 
-=item getorders
+@results = &SearchOrder($search, $biblionumber, $complete);
 
-  ($count, $orders) = &getorders($booksellerid);
+Searches for orders.
 
-Finds pending orders from the bookseller with the given ID. Ignores
-completed and cancelled orders.
+C<$search> may take one of several forms: if it is an ISBN,
+C<&ordersearch> returns orders with that ISBN. If C<$search> is an
+order number, C<&ordersearch> returns orders with that order number
+and biblionumber C<$biblionumber>. Otherwise, C<$search> is considered
+to be a space-separated list of search terms; in this case, all of the
+terms must appear in the title (matching the beginning of title
+words).
 
-C<$count> is the number of elements in C<@{$orders}>.
+If C<$complete> is C<yes>, the results will include only completed
+orders. In any case, C<&ordersearch> ignores cancelled orders.
 
-C<$orders> is a reference-to-array; each element is a
-reference-to-hash with the following fields:
+C<&ordersearch> returns an array.
+C<@results> is an array of references-to-hash with the following keys:
 
 =over 4
 
-=item C<count(*)>
+=item C<author>
 
-Gives the number of orders in with this basket number.
+=item C<seriestitle>
 
-=item C<authorizedby>
+=item C<branchcode>
 
-=item C<entrydate>
+=item C<bookfundid>
 
-=item C<basketno>
-
-These give the value of the corresponding field in the aqorders table
-of the Koha database.
-
-=back
-
-Results are ordered from most to least recent.
+=back
 
 =cut
 
-#'
-sub getorders {
-    my ($supplierid) = @_;
+sub SearchOrder {
+    my ( $search, $id, $biblionumber, $catview ) = @_;
     my $dbh = C4::Context->dbh;
-    my $strsth = "Select count(*),authorisedby,creationdate,aqbasket.basketno,
-closedate,surname,firstname,aqorders.title 
-from aqorders 
-left join aqbasket on aqbasket.basketno=aqorders.basketno 
-left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber
-where booksellerid=? and (quantity > quantityreceived or
-quantityreceived is NULL) and datecancellationprinted is NULL and (to_days(now())-to_days(closedate) < 180 or closedate is null)";
-    if ( C4::Context->preference("IndependantBranches") ) {
-        my $userenv = C4::Context->userenv;
-        if ( ($userenv) && ( $userenv->{flags} != 1 ) ) {
-            $strsth .=
-                " and (borrowers.branchcode = '"
-              . $userenv->{branch}
-              . "' or borrowers.branchcode ='')";
-        }
+    my @data = split( ' ', $search );
+    my @searchterms;
+    if ($id) {
+        @searchterms = ($id);
     }
-    $strsth .= " group by basketno order by aqbasket.basketno";
-    my $sth = $dbh->prepare($strsth);
-    $sth->execute($supplierid);
+    map { push( @searchterms, "$_%", "%$_%" ) } @data;
+    push( @searchterms, $search, $search, $biblionumber );
+    my $query;
+  ### FIXME  THIS CAN raise a problem if more THAN ONE biblioitem is linked to one biblio  
+    if($id and $search){
+        @searchterms = ($id, $search);
+        $query =
+          "SELECT *,biblio.title
+             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 aqbasket.booksellerid = ? AND aqorders.ordernumber = ?
+          "
+    }elsif ($id) {  
+        $query =
+          "SELECT *,biblio.title 
+           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 aqbasket.booksellerid = ?
+            AND ((datecancellationprinted is NULL)
+            OR (datecancellationprinted = '0000-00-00'))
+            AND (("
+          . (
+            join( " AND ",
+                map { "(biblio.title like ? or biblio.title like ?)" } @data )
+          )
+          . ") OR biblioitems.isbn=? OR (aqorders.ordernumber=? AND aqorders.biblionumber=?)) ";
+
+    }
+    else {
+        $query =
+          " SELECT *,biblio.title
+            FROM   aqorders
+            LEFT JOIN biblio ON biblio.biblionumber=aqorders.biblionumber
+            LEFT JOIN aqbasket on aqorders.basketno=aqbasket.basketno
+            LEFT JOIN biblioitems ON biblioitems.biblionumber=biblio.biblionumber      
+            WHERE  ((datecancellationprinted is NULL)
+            OR     (datecancellationprinted = '0000-00-00'))
+            AND    (aqorders.quantityreceived < aqorders.quantity OR aqorders.quantityreceived is NULL)
+            AND (("
+          . (
+            join( " AND ",
+                map { "(biblio.title like ? OR biblio.title like ?)" } @data )
+          )
+          . ") or biblioitems.isbn=? OR (aqorders.ordernumber=? AND aqorders.biblionumber=?)) ";
+    }
+    
+    if ( $biblionumber ) {
+        $query .= "AND biblio.biblionumber = ? ";
+        push (@searchterms, $biblionumber);
+    }
+    
+    $query .= " GROUP BY aqorders.ordernumber";
+    ### $query
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@searchterms);
     my @results = ();
+    my $query2 = "
+        SELECT *
+        FROM   biblio
+        WHERE  biblionumber=?
+    ";
+    my $sth2 = $dbh->prepare($query2);
+    my $query3 = "
+        SELECT *
+        FROM   aqorderbreakdown
+        WHERE  ordernumber=?
+    ";
+    my $sth3 = $dbh->prepare($query3);
+
     while ( my $data = $sth->fetchrow_hashref ) {
+        $sth2->execute( $data->{'biblionumber'} );
+        my $data2 = $sth2->fetchrow_hashref;
+        $data->{'author'}      = $data2->{'author'};
+        $data->{'seriestitle'} = $data2->{'seriestitle'};
+        $sth3->execute( $data->{'ordernumber'} );
+        my $data3 = $sth3->fetchrow_hashref;
+        $data->{'branchcode'} = $data3->{'branchcode'};
+        $data->{'bookfundid'} = $data3->{'bookfundid'};
         push( @results, $data );
     }
+    ### @results
     $sth->finish;
-    return ( scalar(@results), \@results );
+    $sth2->finish;
+    $sth3->finish;
+    return @results;
 }
 
-=item getorder
-
-  ($order, $ordernumber) = &getorder($biblioitemnumber, $biblionumber);
-
-Looks up the order with the given biblionumber and biblioitemnumber.
+#------------------------------------------------------------#
 
-Returns a two-element array. C<$ordernumber> is the order number.
-C<$order> is a reference-to-hash describing the order; its keys are
-fields from the biblio, biblioitems, aqorders, and aqorderbreakdown
-tables of the Koha database.
+=head3 DelOrder
 
-=cut
-
-sub getorder {
-    my ( $bi, $bib ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth =
-      $dbh->prepare(
-"Select ordernumber from aqorders where biblionumber=? and biblioitemnumber=?"
-      );
-    $sth->execute( $bib, $bi );
-
-    # FIXME - Use fetchrow_array(), since we're only interested in the one
-    # value.
-    my $ordnum = $sth->fetchrow_hashref;
-    $sth->finish;
-    my $order = getsingleorder( $ordnum->{'ordernumber'} );
-    return ( $order, $ordnum->{'ordernumber'} );
-}
-
-=item getsingleorder
+=over 4
 
-  $order = &getsingleorder($ordernumber);
+&DelOrder($biblionumber, $ordernumber);
 
-Looks up an order by order number.
+Cancel the order with the given order and biblio numbers. It does not
+delete any entries in the aqorders table, it merely marks them as
+cancelled.
 
-Returns a reference-to-hash describing the order. The keys of
-C<$order> are fields from the biblio, biblioitems, aqorders, and
-aqorderbreakdown tables of the Koha database.
+=back
 
 =cut
 
-sub getsingleorder {
-    my ($ordnum) = @_;
-    my $dbh      = C4::Context->dbh;
-    my $sth      = $dbh->prepare(
-        "Select * from biblio,biblioitems,aqorders left join aqorderbreakdown
-  on aqorders.ordernumber=aqorderbreakdown.ordernumber
-  where aqorders.ordernumber=?
-  and biblio.biblionumber=aqorders.biblionumber and
-  biblioitems.biblioitemnumber=aqorders.biblioitemnumber"
-    );
-    $sth->execute($ordnum);
-    my $data = $sth->fetchrow_hashref;
+sub DelOrder {
+    my ( $bibnum, $ordnum ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $query = "
+        UPDATE aqorders
+        SET    datecancellationprinted=now()
+        WHERE  biblionumber=? AND ordernumber=?
+    ";
+    my $sth = $dbh->prepare($query);
+    $sth->execute( $bibnum, $ordnum );
     $sth->finish;
-    return ($data);
 }
 
-=item getallorders
-
-  ($count, @results) = &getallorders($booksellerid);
-
-Looks up all of the pending orders from the supplier with the given
-bookseller ID. Ignores cancelled and completed orders.
-
-C<$count> is the number of elements in C<@results>. C<@results> is an
-array of references-to-hash. The keys of each element are fields from
-the aqorders, biblio, and biblioitems tables of the Koha database.
-
-C<@results> is sorted alphabetically by book title.
+=head2 FUNCTIONS ABOUT PARCELS
 
 =cut
 
-#'
-sub getallorders {
+#------------------------------------------------------------#
 
-    #gets all orders from a certain supplier, orders them alphabetically
-    my ($supplierid) = @_;
-    my $dbh          = C4::Context->dbh;
-    my @results      = ();
-    my $strsth = "Select count(*),authorisedby,creationdate,aqbasket.basketno,
-closedate,surname,firstname,aqorders.biblionumber,aqorders.title, aqorders.ordernumber 
-from aqorders 
-left join aqbasket on aqbasket.basketno=aqorders.basketno 
-left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber
-where booksellerid=? and (quantity > quantityreceived or
-quantityreceived is NULL) and datecancellationprinted is NULL ";
+=head3 GetParcel
 
-    if ( C4::Context->preference("IndependantBranches") ) {
-        my $userenv = C4::Context->userenv;
-        if ( ($userenv) && ( $userenv->{flags} != 1 ) ) {
-            $strsth .=
-                " and (borrowers.branchcode = '"
-              . $userenv->{branch}
-              . "' or borrowers.branchcode ='')";
-        }
-    }
-    $strsth .= " group by basketno order by aqbasket.basketno";
-    my $sth = $dbh->prepare($strsth);
-    $sth->execute($supplierid);
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
-
-=item getparcelinformation
+=over 4
 
-  ($count, @results) = &getparcelinformation($booksellerid, $code, $date);
+@results = &GetParcel($booksellerid, $code, $date);
 
 Looks up all of the received items from the supplier with the given
-bookseller ID at the given date, for the given code. Ignores cancelled and completed orders.
+bookseller ID at the given date, for the given code (bookseller Invoice number). Ignores cancelled and completed orders.
 
-C<$count> is the number of elements in C<@results>. C<@results> is an
-array of references-to-hash. The keys of each element are fields from
+C<@results> is an array of references-to-hash. The keys of each element are fields from
 the aqorders, biblio, and biblioitems tables of the Koha database.
 
 C<@results> is sorted alphabetically by book title.
 
-=cut
+=back
 
-#'
-sub getparcelinformation {
+=cut
 
+sub GetParcel {
     #gets all orders from a certain supplier, orders them alphabetically
     my ( $supplierid, $code, $datereceived ) = @_;
     my $dbh     = C4::Context->dbh;
     my @results = ();
     $code .= '%'
       if $code;  # add % if we search on a given code (otherwise, let him empty)
-    my $strsth =
-"Select authorisedby,creationdate,aqbasket.basketno,closedate,surname,firstname,aqorders.biblionumber,aqorders.title,aqorders.ordernumber, aqorders.quantity, aqorders.quantityreceived, aqorders.unitprice, aqorders.listprice, aqorders.rrp, aqorders.ecost from aqorders,aqbasket left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber where aqbasket.basketno=aqorders.basketno and aqbasket.booksellerid=? and aqorders.booksellerinvoicenumber like  \"$code\" and aqorders.datereceived= \'$datereceived\'";
-
+    my $strsth ="
+        SELECT  authorisedby,
+                creationdate,
+                aqbasket.basketno,
+                closedate,surname,
+                firstname,
+                aqorders.biblionumber,
+                aqorders.title,
+                aqorders.ordernumber,
+                aqorders.quantity,
+                aqorders.quantityreceived,
+                aqorders.unitprice,
+                aqorders.listprice,
+                aqorders.rrp,
+                aqorders.ecost
+        FROM aqorders 
+        LEFT JOIN aqbasket ON aqbasket.basketno=aqorders.basketno
+        LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber
+        WHERE 
+            aqbasket.booksellerid = ?
+            AND aqorders.booksellerinvoicenumber LIKE ?
+            AND aqorders.datereceived = ? ";
+
+    my @query_params = ( $supplierid, $code, $datereceived );
     if ( C4::Context->preference("IndependantBranches") ) {
         my $userenv = C4::Context->userenv;
         if ( ($userenv) && ( $userenv->{flags} != 1 ) ) {
-            $strsth .=
-                " and (borrowers.branchcode = '"
-              . $userenv->{branch}
-              . "' or borrowers.branchcode ='')";
+            $strsth .= " and (borrowers.branchcode = ?
+                          or borrowers.branchcode  = '')";
+            push @query_params, $userenv->{branch};
         }
     }
-    $strsth .= " order by aqbasket.basketno";
+    $strsth .= " ORDER BY aqbasket.basketno";
     ### parcelinformation : $strsth
     my $sth = $dbh->prepare($strsth);
-    $sth->execute($supplierid);
+    $sth->execute( @query_params );
     while ( my $data = $sth->fetchrow_hashref ) {
         push( @results, $data );
     }
-    my $count = scalar(@results);
-    ### countparcelbiblio: $count
+    ### countparcelbiblio: scalar(@results)
     $sth->finish;
 
-    return ( scalar(@results), @results );
+    return @results;
 }
-=item getparcelinformation
-
-  ($count, @results) = &getparcelinformation($booksellerid, $code, $date);
 
-Looks up all of the received items from the supplier with the given
-bookseller ID at the given date, for the given code. Ignores cancelled and completed orders.
+#------------------------------------------------------------#
 
-C<$count> is the number of elements in C<@results>. C<@results> is an
-array of references-to-hash. The keys of each element are fields from
-the aqorders, biblio, and biblioitems tables of the Koha database.
+=head3 GetParcels
 
-C<@results> is sorted alphabetically by book title.
+=over 4
 
-=cut
-#'
-sub getparcelinformation {
-  #gets all orders from a certain supplier, orders them alphabetically
-  my ($supplierid,$code, $datereceived)=@_;
-  my $dbh = C4::Context->dbh;
-  my @results = ();
-  $code .='%' if $code; # add % if we search on a given code (otherwise, let him empty)
-       my $strsth ="Select authorisedby,creationdate,aqbasket.basketno,closedate,surname,firstname,aqorders.biblionumber,aqorders.title,aqorders.ordernumber, aqorders.quantity, aqorders.quantityreceived, aqorders.unitprice, aqorders.listprice, aqorders.rrp, aqorders.ecost from aqorders,aqbasket left join borrowers on aqbasket.authorisedby=borrowers.borrowernumber where aqbasket.basketno=aqorders.basketno and aqbasket.booksellerid=? and aqorders.booksellerinvoicenumber like  \"$code\" and aqorders.datereceived= \'$datereceived\'";
-               
-       if (C4::Context->preference("IndependantBranches")) {
-               my $userenv = C4::Context->userenv;
-               if (($userenv) &&($userenv->{flags} != 1)){
-                       $strsth .= " and (borrowers.branchcode = '".$userenv->{branch}."' or borrowers.branchcode ='')";
-               }
-       }
-       $strsth.=" order by aqbasket.basketno";
-       ### parcelinformation : $strsth
-       my $sth=$dbh->prepare($strsth);
-  $sth->execute($supplierid);
-  while (my $data=$sth->fetchrow_hashref){
-    push(@results,$data);
-  }
-  my $count =scalar(@results);
-  ### countparcelbiblio: $count
-  $sth->finish;
-  
-  return(scalar(@results),@results);
-}
-=item getsupplierlistwithlateorders
+$results = &GetParcels($bookseller, $order, $code, $datefrom, $dateto);
+get a lists of parcels.
 
-  %results = &getsupplierlistwithlateorders;
+=back
 
-Searches for suppliers with late orders.
+* Input arg :
 
-=cut
+=over 4
 
-#'
-sub getsupplierlistwithlateorders {
-    my $delay = shift;
-    my $dbh   = C4::Context->dbh;
+=item $bookseller
+is the bookseller this function has to get parcels.
 
-#FIXME NOT quite sure that this operation is valid for DBMs different from Mysql, HOPING so
-#should be tested with other DBMs
+=item $order
+To know on what criteria the results list has to be ordered.
 
-    my $strsth;
-    my $dbdriver = C4::Context->config("db_scheme") || "mysql";
-    if ( $dbdriver eq "mysql" ) {
-        $strsth = "SELECT DISTINCT aqbasket.booksellerid, aqbooksellers.name
-                                       FROM aqorders, aqbasket
-                                       LEFT JOIN aqbooksellers ON aqbasket.booksellerid = aqbooksellers.id
-                                       WHERE aqorders.basketno = aqbasket.basketno AND
-                                       (closedate < DATE_SUB(CURDATE( ),INTERVAL $delay DAY) AND (datereceived = '' or datereceived is null))
-                                       ";
-    }
-    else {
-        $strsth = "SELECT DISTINCT aqbasket.booksellerid, aqbooksellers.name
-                       FROM aqorders, aqbasket
-                       LEFT JOIN aqbooksellers ON aqbasket.aqbooksellerid = aqbooksellers.id
-                       WHERE aqorders.basketno = aqbasket.basketno AND
-                       (closedate < (CURDATE( )-(INTERVAL $delay DAY))) AND (datereceived = '' or datereceived is null))
-                       ";
-    }
+=item $code
+is the booksellerinvoicenumber.
 
-    #  warn "C4::Acquisition getsupplierlistwithlateorders : ".$strsth;
-    my $sth = $dbh->prepare($strsth);
-    $sth->execute;
-    my %supplierlist;
-    while ( my ( $id, $name ) = $sth->fetchrow ) {
-        $supplierlist{$id} = $name;
-    }
-    return %supplierlist;
-}
+=item $datefrom & $dateto
+to know on what date this function has to filter its search.
 
-=item getlateorders
+* return:
+a pointer on a hash list containing parcel informations as such :
 
-  %results = &getlateorders;
+=item Creation date
 
-Searches for suppliers with late orders.
+=item Last operation
 
-=cut
+=item Number of biblio
 
-#'
-sub getlateorders {
-    my $delay      = shift;
-    my $supplierid = shift;
-    my $branch     = shift;
+=item Number of items
 
-    my $dbh = C4::Context->dbh;
+=back
 
-    #BEWARE, order of parenthesis and LEFT JOIN is important for speed
-    my $strsth;
-    my $dbdriver = C4::Context->config("db_scheme") || "mysql";
+=cut
 
-    #  warn " $dbdriver";
-    if ( $dbdriver eq "mysql" ) {
-        $strsth = "SELECT aqbasket.basketno,
-                                       DATE(aqbasket.closedate) as orderdate, aqorders.quantity - IFNULL(aqorders.quantityreceived,0) as quantity, aqorders.rrp as unitpricesupplier,aqorders.ecost as unitpricelib,
-                                       (aqorders.quantity - IFNULL(aqorders.quantityreceived,0)) * aqorders.rrp as subtotal, aqbookfund.bookfundname as budget, borrowers.branchcode as branch,
-                                       aqbooksellers.name as supplier,
-                                       aqorders.title, biblio.author, biblioitems.publishercode as publisher, biblioitems.publicationyear,
-                                       DATEDIFF(CURDATE( ),closedate) AS latesince
-                                       FROM 
-                                               ((      (
-                                                               (aqorders LEFT JOIN biblio on biblio.biblionumber = aqorders.biblionumber) LEFT JOIN biblioitems on  biblioitems.biblionumber=biblio.biblionumber
-                                                       )  LEFT JOIN aqorderbreakdown on aqorders.ordernumber = aqorderbreakdown.ordernumber
-                                               ) LEFT JOIN aqbookfund on aqorderbreakdown.bookfundid = aqbookfund.bookfundid
-                                               ),(aqbasket LEFT JOIN borrowers on aqbasket.authorisedby = borrowers.borrowernumber) LEFT JOIN aqbooksellers ON aqbasket.booksellerid = aqbooksellers.id
-                                       WHERE aqorders.basketno = aqbasket.basketno AND (closedate < DATE_SUB(CURDATE( ),INTERVAL $delay DAY)) 
-                                       AND ((datereceived = '' OR datereceived is null) OR (aqorders.quantityreceived < aqorders.quantity) ) ";
-        $strsth .= " AND aqbasket.booksellerid = $supplierid " if ($supplierid);
-        $strsth .= " AND borrowers.branchcode like \'" . $branch . "\'"
-          if ($branch);
-        $strsth .=
-          " AND borrowers.branchcode like \'"
-          . C4::Context->userenv->{branch} . "\'"
-          if ( C4::Context->preference("IndependantBranches")
-            && C4::Context->userenv
-            && C4::Context->userenv->{flags} != 1 );
-        $strsth .=
-" HAVING quantity<>0 AND unitpricesupplier<>0 AND unitpricelib<>0 ORDER BY latesince,basketno,borrowers.branchcode, supplier ";
-    }
-    else {
-        $strsth = "SELECT aqbasket.basketno,
-                                       DATE(aqbasket.closedate) as orderdate, 
-                                       aqorders.quantity, aqorders.rrp as unitpricesupplier,aqorders.ecost as unitpricelib, aqorders.quantity * aqorders.rrp as subtotal
-                                       aqbookfund.bookfundname as budget, borrowers.branchcode as branch,
-                                       aqbooksellers.name as supplier,
-                                       biblio.title, biblio.author, biblioitems.publishercode as publisher, biblioitems.publicationyear,
-                                       (CURDATE -  closedate) AS latesince
-                                       FROM 
-                                               ((      (
-                                                               (aqorders LEFT JOIN biblio on biblio.biblionumber = aqorders.biblionumber) LEFT JOIN biblioitems on  biblioitems.biblionumber=biblio.biblionumber
-                                                       )  LEFT JOIN aqorderbreakdown on aqorders.ordernumber = aqorderbreakdown.ordernumber
-                                               ) LEFT JOIN aqbookfund on aqorderbreakdown.bookfundid = aqbookfund.bookfundid
-                                               ),(aqbasket LEFT JOIN borrowers on aqbasket.authorisedby = borrowers.borrowernumber) LEFT JOIN aqbooksellers ON aqbasket.booksellerid = aqbooksellers.id
-                                       WHERE aqorders.basketno = aqbasket.basketno AND (closedate < (CURDATE -(INTERVAL $delay DAY)) 
-                                       AND ((datereceived = '' OR datereceived is null) OR (aqorders.quantityreceived < aqorders.quantity) ) ";
-        $strsth .= " AND aqbasket.booksellerid = $supplierid " if ($supplierid);
-        $strsth .= " AND borrowers.branchcode like \'" . $branch . "\'"
-          if ($branch);
-        $strsth .=
-          " AND borrowers.branchcode like \'"
-          . C4::Context->userenv->{branch} . "\'"
-          if ( C4::Context->preference("IndependantBranches")
-            && C4::Context->userenv->{flags} != 1 );
-        $strsth .=
-          " ORDER BY latesince,basketno,borrowers.branchcode, supplier";
+sub GetParcels {
+    my ($bookseller,$order, $code, $datefrom, $dateto) = @_;
+    my $dbh    = C4::Context->dbh;
+    my @query_params = ();
+    my $strsth ="
+        SELECT  aqorders.booksellerinvoicenumber,
+                datereceived,purchaseordernumber,
+                count(DISTINCT biblionumber) AS biblio,
+                sum(quantity) AS itemsexpected,
+                sum(quantityreceived) AS itemsreceived
+        FROM   aqorders LEFT JOIN aqbasket ON aqbasket.basketno = aqorders.basketno
+        WHERE aqbasket.booksellerid = $bookseller and datereceived IS NOT NULL
+    ";
+
+    if ( defined $code ) {
+        $strsth .= ' and aqorders.booksellerinvoicenumber like ? ';
+        # add a % to the end of the code to allow stemming.
+        push @query_params, "$code%";
     }
-    warn "C4::Acquisition : getlateorders SQL:" . $strsth;
-    my $sth = $dbh->prepare($strsth);
-    $sth->execute;
-    my @results;
-    my $hilighted = 1;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        $data->{hilighted} = $hilighted if ( $hilighted > 0 );
-        $data->{orderdate} = format_date( $data->{orderdate} );
-        push @results, $data;
-        $hilighted = -$hilighted;
+    
+    if ( defined $datefrom ) {
+        $strsth .= ' and datereceived >= ? ';
+        push @query_params, $datefrom;
     }
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
-
-# FIXME - Never used
-sub getrecorders {
 
-    #gets all orders from a certain supplier, orders them alphabetically
-    my ($supid) = @_;
-    my $dbh     = C4::Context->dbh;
-    my @results = ();
-    my $sth     = $dbh->prepare(
-        "Select * from aqorders,biblio,biblioitems where booksellerid=?
-  and (cancelledby is NULL or cancelledby = '')
-  and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
-  aqorders.biblioitemnumber and
-  aqorders.quantityreceived>0
-  and aqorders.datereceived >=now()
-  group by aqorders.biblioitemnumber
-  order by
-  biblio.title"
-    );
-    $sth->execute($supid);
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
+    if ( defined $dateto ) {
+        $strsth .=  'and datereceived <= ? ';
+        push @query_params, $dateto;
     }
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
 
-=item ordersearch
+    $strsth .= "group by aqorders.booksellerinvoicenumber,datereceived ";
 
-  ($count, @results) = &ordersearch($search, $biblionumber, $complete);
+    # can't use a placeholder to place this column name.
+    # but, we could probably be checking to make sure it is a column that will be fetched.
+    $strsth .= "order by $order " if ($order);
 
-Searches for orders.
+    my $sth = $dbh->prepare($strsth);
 
-C<$search> may take one of several forms: if it is an ISBN,
-C<&ordersearch> returns orders with that ISBN. If C<$search> is an
-order number, C<&ordersearch> returns orders with that order number
-and biblionumber C<$biblionumber>. Otherwise, C<$search> is considered
-to be a space-separated list of search terms; in this case, all of the
-terms must appear in the title (matching the beginning of title
-words).
+    $sth->execute( @query_params );
+    my $results = $sth->fetchall_arrayref({});
+    $sth->finish;
+    return @$results;
+}
 
-If C<$complete> is C<yes>, the results will include only completed
-orders. In any case, C<&ordersearch> ignores cancelled orders.
+#------------------------------------------------------------#
 
-C<&ordersearch> returns an array. C<$count> is the number of elements
-in C<@results>. C<@results> is an array of references-to-hash with the
-following keys:
+=head3 GetLateOrders
 
 =over 4
 
-=item C<author>
+@results = &GetLateOrders;
 
-=item C<seriestitle>
-
-=item C<branchcode>
+Searches for bookseller with late orders.
 
-=item C<bookfundid>
+return:
+the table of supplier with late issues. This table is full of hashref.
 
 =back
 
 =cut
 
-#'
-sub ordersearch {
-    my ( $search, $id, $biblio, $catview ) = @_;
+sub GetLateOrders {
+    my $delay      = shift;
+    my $supplierid = shift;
+    my $branch     = shift;
+
     my $dbh = C4::Context->dbh;
-    my @data = split( ' ', $search );
-    my @searchterms;
-    if ($id) {
-        @searchterms = ($id);
-    }
-    map { push( @searchterms, "$_%", "% $_%" ) } @data;
-    push( @searchterms, $search, $search, $biblio );
-    my $query;
-    if ($id) {
-        $query =
-          "SELECT *,biblio.title FROM aqorders,biblioitems,biblio,aqbasket
-  WHERE aqorders.biblioitemnumber = biblioitems.biblioitemnumber AND
-  aqorders.basketno = aqbasket.basketno
-  AND aqbasket.booksellerid = ?
-  AND biblio.biblionumber=aqorders.biblionumber
-  AND ((datecancellationprinted is NULL)
-      OR (datecancellationprinted = '0000-00-00'))
-  AND (("
-          . (
-            join( " AND ",
-                map { "(biblio.title like ? or biblio.title like ?)" } @data )
-          )
-          . ") OR biblioitems.isbn=? OR (aqorders.ordernumber=? AND aqorders.biblionumber=?)) ";
 
-    }
-    else {
-        $query =
-          "SELECT *,biblio.title FROM aqorders,biblioitems,biblio,aqbasket
-  WHERE aqorders.biblioitemnumber = biblioitems.biblioitemnumber AND
-  aqorders.basketno = aqbasket.basketno
-  AND biblio.biblionumber=aqorders.biblionumber
-  AND ((datecancellationprinted is NULL)
-      OR (datecancellationprinted = '0000-00-00'))
-  AND (aqorders.quantityreceived < aqorders.quantity OR aqorders.quantityreceived is NULL)
-  AND (("
-          . (
-            join( " AND ",
-                map { "(biblio.title like ? OR biblio.title like ?)" } @data )
+    #BEWARE, order of parenthesis and LEFT JOIN is important for speed
+    my $dbdriver = C4::Context->config("db_scheme") || "mysql";
+
+    my @query_params = ($delay);       # delay is the first argument regardless
+       my $select = "
+      SELECT aqbasket.basketno,
+          aqorders.ordernumber,
+          DATE(aqbasket.closedate)  AS orderdate,
+          aqorders.rrp              AS unitpricesupplier,
+          aqorders.ecost            AS unitpricelib,
+          aqbookfund.bookfundname   AS budget,
+          borrowers.branchcode      AS branch,
+          aqbooksellers.name        AS supplier,
+          aqorders.title,
+          biblio.author,
+          biblioitems.publishercode AS publisher,
+          biblioitems.publicationyear,
+       ";
+       my $from = "
+      FROM (((
+          (aqorders LEFT JOIN biblio     ON biblio.biblionumber         = aqorders.biblionumber)
+          LEFT JOIN biblioitems          ON biblioitems.biblionumber    = biblio.biblionumber)
+          LEFT JOIN aqorderbreakdown     ON aqorders.ordernumber        = aqorderbreakdown.ordernumber)
+          LEFT JOIN aqbookfund           ON aqorderbreakdown.bookfundid = aqbookfund.bookfundid),
+          (aqbasket LEFT JOIN borrowers  ON aqbasket.authorisedby       = borrowers.borrowernumber)
+          LEFT JOIN aqbooksellers        ON aqbasket.booksellerid       = aqbooksellers.id
+          WHERE aqorders.basketno = aqbasket.basketno
+          AND ( (datereceived = '' OR datereceived IS NULL)
+              OR (aqorders.quantityreceived < aqorders.quantity)
           )
-          . ") or biblioitems.isbn=? OR (aqorders.ordernumber=? AND aqorders.biblionumber=?)) ";
+    ";
+       my $having = "";
+    if ($dbdriver eq "mysql") {
+               $select .= "
+           aqorders.quantity - IFNULL(aqorders.quantityreceived,0)                 AS quantity,
+          (aqorders.quantity - IFNULL(aqorders.quantityreceived,0)) * aqorders.rrp AS subtotal,
+          DATEDIFF(CURDATE( ),closedate) AS latesince
+               ";
+        $from .= " AND (closedate <= DATE_SUB(CURDATE( ),INTERVAL ? DAY)) ";
+               $having = "
+         HAVING quantity          <> 0
+            AND unitpricesupplier <> 0
+            AND unitpricelib      <> 0
+               ";
+    } else {
+               # FIXME: account for IFNULL as above
+        $select .= "
+                aqorders.quantity                AS quantity,
+                aqorders.quantity * aqorders.rrp AS subtotal,
+                (CURDATE - closedate)            AS latesince
+               ";
+        $from .= " AND (closedate <= (CURDATE -(INTERVAL ? DAY)) ";
     }
-    $query .= " GROUP BY aqorders.ordernumber";
+    if (defined $supplierid) {
+               $from .= ' AND aqbasket.booksellerid = ? ';
+        push @query_params, $supplierid;
+    }
+    if (defined $branch) {
+        $from .= ' AND borrowers.branchcode LIKE ? ';
+        push @query_params, $branch;
+    }
+    if (C4::Context->preference("IndependantBranches")
+             && C4::Context->userenv
+             && C4::Context->userenv->{flags} != 1 ) {
+        $from .= ' AND borrowers.branchcode LIKE ? ';
+        push @query_params, C4::Context->userenv->{branch};
+    }
+       my $query = "$select $from $having\nORDER BY latesince, basketno, borrowers.branchcode, supplier";
+       $debug and print STDERR "GetLateOrders query: $query\nGetLateOrders args: " . join(" ",@query_params);
     my $sth = $dbh->prepare($query);
-    $sth->execute(@searchterms);
-    my @results = ();
-    my $sth2    = $dbh->prepare("SELECT * FROM biblio WHERE biblionumber=?");
-    my $sth3    =
-      $dbh->prepare("SELECT * FROM aqorderbreakdown WHERE ordernumber=?");
-    while ( my $data = $sth->fetchrow_hashref ) {
-        $sth2->execute( $data->{'biblionumber'} );
-        my $data2 = $sth2->fetchrow_hashref;
-        $data->{'author'}      = $data2->{'author'};
-        $data->{'seriestitle'} = $data2->{'seriestitle'};
-        $sth3->execute( $data->{'ordernumber'} );
-        my $data3 = $sth3->fetchrow_hashref;
-        $data->{'branchcode'} = $data3->{'branchcode'};
-        $data->{'bookfundid'} = $data3->{'bookfundid'};
-        push( @results, $data );
+    $sth->execute(@query_params);
+    my @results;
+    while (my $data = $sth->fetchrow_hashref) {
+        $data->{orderdate} = format_date($data->{orderdate});
+        push @results, $data;
     }
-    $sth->finish;
-    $sth2->finish;
-    $sth3->finish;
-    return ( scalar(@results), @results );
+    return @results;
 }
 
-sub histsearch {
+#------------------------------------------------------------#
+
+=head3 GetHistory
+
+=over 4
+
+(\@order_loop, $total_qty, $total_price, $total_qtyreceived) = GetHistory( $title, $author, $name, $from_placed_on, $to_placed_on );
+
+  Retreives some acquisition history information
+
+  returns:
+    $order_loop is a list of hashrefs that each look like this:
+              {
+                'author'           => 'Twain, Mark',
+                'basketno'         => '1',
+                'biblionumber'     => '215',
+                'count'            => 1,
+                'creationdate'     => 'MM/DD/YYYY',
+                'datereceived'     => undef,
+                'ecost'            => '1.00',
+                'id'               => '1',
+                'invoicenumber'    => undef,
+                'name'             => '',
+                'ordernumber'      => '1',
+                'quantity'         => 1,
+                'quantityreceived' => undef,
+                'title'            => 'The Adventures of Huckleberry Finn'
+              }
+    $total_qty is the sum of all of the quantities in $order_loop
+    $total_price is the cost of each in $order_loop times the quantity
+    $total_qtyreceived is the sum of all of the quantityreceived entries in $order_loop
+
+=back
+
+=cut
+
+sub GetHistory {
     my ( $title, $author, $name, $from_placed_on, $to_placed_on ) = @_;
     my @order_loop;
     my $total_qty         = 0;
     my $total_qtyreceived = 0;
     my $total_price       = 0;
 
-# don't run the query if there are no parameters (list would be too long for sure !
+# don't run the query if there are no parameters (list would be too long for sure !)
     if ( $title || $author || $name || $from_placed_on || $to_placed_on ) {
         my $dbh   = C4::Context->dbh;
-        my $query =
-"select biblio.title,biblio.author,aqorders.basketno,name,aqbasket.creationdate,aqorders.datereceived, aqorders.quantity, aqorders.quantityreceived, aqorders.ecost from aqorders,aqbasket,aqbooksellers,biblio";
-        $query .= ",borrowers "
+        my $query ="
+            SELECT
+                biblio.title,
+                biblio.author,
+                aqorders.basketno,
+                name,aqbasket.creationdate,
+                aqorders.datereceived,
+                aqorders.quantity,
+                aqorders.quantityreceived,
+                aqorders.ecost,
+                aqorders.ordernumber,
+                aqorders.booksellerinvoicenumber as invoicenumber,
+                aqbooksellers.id as id,
+                aqorders.biblionumber
+            FROM aqorders 
+            LEFT JOIN aqbasket ON aqorders.basketno=aqbasket.basketno 
+            LEFT JOIN aqbooksellers ON aqbasket.booksellerid=aqbooksellers.id
+            LEFT JOIN biblio ON biblio.biblionumber=aqorders.biblionumber";
+
+        $query .= " LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber"
           if ( C4::Context->preference("IndependantBranches") );
-        $query .=
-" where aqorders.basketno=aqbasket.basketno and aqbasket.booksellerid=aqbooksellers.id and biblio.biblionumber=aqorders.biblionumber ";
-        $query .= " and aqbasket.authorisedby=borrowers.borrowernumber"
-          if ( C4::Context->preference("IndependantBranches") );
-        $query .= " and biblio.title like " . $dbh->quote( "%" . $title . "%" )
-          if $title;
-        $query .=
-          " and biblio.author like " . $dbh->quote( "%" . $author . "%" )
-          if $author;
-        $query .= " and name like " . $dbh->quote( "%" . $name . "%" ) if $name;
-        $query .= " and creationdate >" . $dbh->quote($from_placed_on)
-          if $from_placed_on;
-        $query .= " and creationdate<" . $dbh->quote($to_placed_on)
-          if $to_placed_on;
+
+        $query .= " WHERE (datecancellationprinted is NULL or datecancellationprinted='0000-00-00') ";
+        
+        my @query_params  = ();
+        
+        if ( defined $title ) {
+            $query .= " AND biblio.title LIKE ? ";
+            push @query_params, "%$title%";
+        }
+
+        if ( defined $author ) {
+            $query .= " AND biblio.author LIKE ? ";
+            push @query_params, "%$author%";
+        }
+
+        if ( defined $name ) {
+            $query .= " AND name LIKE ? ";
+            push @query_params, "%$name%";
+        }            
+
+        if ( defined $from_placed_on ) {
+            $query .= " AND creationdate >= ? ";
+            push @query_params, $from_placed_on;
+        }
+
+        if ( defined $to_placed_on ) {
+            $query .= " AND creationdate <= ? ";
+            push @query_params, $to_placed_on;
+        }
 
         if ( C4::Context->preference("IndependantBranches") ) {
             my $userenv = C4::Context->userenv;
             if ( ($userenv) && ( $userenv->{flags} != 1 ) ) {
-                $query .=
-                    " and (borrowers.branchcode = '"
-                  . $userenv->{branch}
-                  . "' or borrowers.branchcode ='')";
+                $query .= " AND (borrowers.branchcode = ? OR borrowers.branchcode ='' ) ";
+                push @query_params, $userenv->{branch};
             }
         }
-        $query .= " order by booksellerid";
-        warn "query histearch: " . $query;
+        $query .= " ORDER BY booksellerid";
         my $sth = $dbh->prepare($query);
-        $sth->execute;
+        $sth->execute( @query_params );
         my $cnt = 1;
         while ( my $line = $sth->fetchrow_hashref ) {
             $line->{count} = $cnt++;
@@ -1034,468 +1192,35 @@ sub histsearch {
     return \@order_loop, $total_qty, $total_price, $total_qtyreceived;
 }
 
-#
-#
-# MONEY
-#
-#
-
-=item invoice
-
-  ($count, @results) = &invoice($booksellerinvoicenumber);
-
-Looks up orders by invoice number.
-
-Returns an array. C<$count> is the number of elements in C<@results>.
-C<@results> is an array of references-to-hash; the keys of each
-elements are fields from the aqorders, biblio, and biblioitems tables
-of the Koha database.
-
-=cut
-
-#'
-sub invoice {
-    my ($invoice) = @_;
-    my $dbh       = C4::Context->dbh;
-    my @results   = ();
-    my $sth       = $dbh->prepare(
-        "Select * from aqorders,biblio,biblioitems where
-  booksellerinvoicenumber=?
-  and biblio.biblionumber=aqorders.biblionumber and biblioitems.biblioitemnumber=
-  aqorders.biblioitemnumber group by aqorders.ordernumber,aqorders.biblioitemnumber"
-    );
-    $sth->execute($invoice);
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
-
-=item bookfunds
-
-  ($count, @results) = &bookfunds();
-
-Returns a list of all book funds.
-
-C<$count> is the number of elements in C<@results>. C<@results> is an
-array of references-to-hash, whose keys are fields from the aqbookfund
-and aqbudget tables of the Koha database. Results are ordered
-alphabetically by book fund name.
-
-=cut
-
-#'
-sub bookfunds {
-    my ($branch) = @_;
-    my $dbh      = C4::Context->dbh;
-    my $userenv  = C4::Context->userenv;
-    my $branch   = $userenv->{branch};
-    my $strsth;
-
-    if ( $branch ne '' ) {
-        $strsth = "SELECT * FROM aqbookfund,aqbudget WHERE aqbookfund.bookfundid
-      =aqbudget.bookfundid AND startdate<now() AND enddate>now() AND (aqbookfund.branchcode is null or aqbookfund.branchcode='' or aqbookfund.branchcode= ? )
-      GROUP BY aqbookfund.bookfundid ORDER BY bookfundname";
-    }
-    else {
-        $strsth = "SELECT * FROM aqbookfund,aqbudget WHERE aqbookfund.bookfundid
-      =aqbudget.bookfundid AND startdate<now() AND enddate>now()
-      GROUP BY aqbookfund.bookfundid ORDER BY bookfundname";
-    }
-    my $sth = $dbh->prepare($strsth);
-    if ( $branch ne '' ) {
-        $sth->execute($branch);
-    }
-    else {
-        $sth->execute;
-    }
-    my @results = ();
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
-
-=item bookfundbreakdown
-
-       returns the total comtd & spent for a given bookfund, and a given year
-       used in acqui-home.pl
-=cut
-
-#'
-
-sub bookfundbreakdown {
-    my ( $id, $year ,$start, $end) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare(
-        "SELECT quantity,datereceived,freight,unitprice,listprice,ecost,
-  quantityreceived,subscription
-  FROM aqorders,aqorderbreakdown WHERE bookfundid=? AND
-  aqorders.ordernumber=aqorderbreakdown.ordernumber
-  AND (datecancellationprinted is NULL OR
-      datecancellationprinted='0000-00-00')"
-    );
-    if ($start) {
-        $sth = $dbh->prepare(
-            "SELECT quantity,datereceived,freight,unitprice,listprice,ecost,
-  quantityreceived,subscription
-  FROM aqorders,aqorderbreakdown
-  WHERE bookfundid=? AND
-  aqorders.ordernumber=aqorderbreakdown.ordernumber
-  AND (datecancellationprinted is NULL OR
-     datecancellationprinted='0000-00-00')
-  AND ((datereceived >= ? AND datereceived < ?) OR
- (budgetdate >= ? AND budgetdate < ?))"
-        );
-        $sth->execute( $id, $start, $end, $start, $end );
-    }
-    else {
-        $sth->execute($id);
-    }
-
-    my $comtd = 0;
-    my $spent = 0;
-    while ( my $data = $sth->fetchrow_hashref ) {
-
-        if ( $data->{'subscription'} == 1 ) {
-            $spent += $data->{'quantity'} * $data->{'unitprice'};
-        }
-        else {
-            my $leftover = $data->{'quantity'} - $data->{'quantityreceived'};
-            $comtd += ( $data->{'ecost'} ) * $leftover;
-            $spent += ( $data->{'unitprice'} ) * $data->{'quantityreceived'};
-        }
-    }
-    $sth->finish;
-    return ( $spent, $comtd );
-}
-
-=item curconvert
-
-  $foreignprice = &curconvert($currency, $localprice);
-
-Converts the price C<$localprice> to foreign currency C<$currency> by
-dividing by the exchange rate, and returns the result.
-
-If no exchange rate is found, C<&curconvert> assumes the rate is one
-to one.
-
-=cut
-
-#'
-sub curconvert {
-    my ( $currency, $price ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("Select rate from currency where currency=?");
-    $sth->execute($currency);
-    my $cur = ( $sth->fetchrow_array() )[0];
-    $sth->finish;
-    if ( $cur == 0 ) {
-        $cur = 1;
-    }
-    return ( $price / $cur );
-}
-
-=item getcurrencies
-
-  ($count, $currencies) = &getcurrencies();
-
-Returns the list of all known currencies.
-
-C<$count> is the number of elements in C<$currencies>. C<$currencies>
-is a reference-to-array; its elements are references-to-hash, whose
-keys are the fields from the currency table in the Koha database.
-
-=cut
-
-#'
-sub getcurrencies {
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("Select * from currency");
-    $sth->execute;
-    my @results = ();
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-    $sth->finish;
-    return ( scalar(@results), \@results );
-}
-
-=item updatecurrencies
-
-  &updatecurrencies($currency, $newrate);
-
-Sets the exchange rate for C<$currency> to be C<$newrate>.
-
-=cut
-
-#'
-sub updatecurrencies {
-    my ( $currency, $rate ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("update currency set rate=? where currency=?");
-    $sth->execute( $rate, $currency );
-    $sth->finish;
-}
-
-#
-#
-# OTHERS
-#
-#
-
-=item bookseller
-
-  ($count, @results) = &bookseller($searchstring);
-
-Looks up a book seller. C<$searchstring> may be either a book seller
-ID, or a string to look for in the book seller's name.
-
-C<$count> is the number of elements in C<@results>. C<@results> is an
-array of references-to-hash, whose keys are the fields of of the
-aqbooksellers table in the Koha database.
-
-=cut
-
-#'
-sub bookseller {
-    my ($searchstring) = @_;
-    my $dbh            = C4::Context->dbh;
-    my $sth            =
-      $dbh->prepare("Select * from aqbooksellers where name like ? or id = ?");
-    $sth->execute( "$searchstring%", $searchstring );
-    my @results;
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
-
-=item breakdown
-
-  ($count, $results) = &breakdown($ordernumber);
-
-Looks up an order by order ID, and returns its breakdown.
-
-C<$count> is the number of elements in C<$results>. C<$results> is a
-reference-to-array; its elements are references-to-hash, whose keys
-are the fields of the aqorderbreakdown table in the Koha database.
-
-=cut
-
-#'
-sub breakdown {
-    my ($id) = @_;
-    my $dbh  = C4::Context->dbh;
-    my $sth  =
-      $dbh->prepare("Select * from aqorderbreakdown where ordernumber=?");
-    $sth->execute($id);
-    my @results = ();
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }
-    $sth->finish;
-    return ( scalar(@results), \@results );
-}
-
-=item branches
-
-  ($count, @results) = &branches();
+=head2 GetRecentAcqui
 
-Returns a list of all library branches.
+   $results = GetRecentAcqui($days);
 
-C<$count> is the number of elements in C<@results>. C<@results> is an
-array of references-to-hash, whose keys are the fields of the branches
-table of the Koha database.
+   C<$results> is a ref to a table which containts hashref
 
 =cut
 
-#'
-sub branches {
-    my $dbh = C4::Context->dbh;
-    my $sth;
-    if (   C4::Context->preference("IndependantBranches")
-        && ( C4::Context->userenv )
-        && ( C4::Context->userenv->{flags} != 1 ) )
-    {
-        my $strsth = "Select * from branches ";
-        $strsth .=
-          " WHERE branchcode = "
-          . $dbh->quote( C4::Context->userenv->{branch} );
-        $strsth .= " order by branchname";
-        warn "C4::Acquisition->branches : " . $strsth;
-        $sth = $dbh->prepare($strsth);
-    }
-    else {
-        $sth = $dbh->prepare("Select * from branches order by branchname");
-    }
-    my @results = ();
-
-    $sth->execute();
-    while ( my $data = $sth->fetchrow_hashref ) {
-        push( @results, $data );
-    }    # while
-
-    $sth->finish;
-    return ( scalar(@results), @results );
-}    # sub branches
-
-=item updatesup
-
-  &updatesup($bookseller);
-
-Updates the information for a given bookseller. C<$bookseller> is a
-reference-to-hash whose keys are the fields of the aqbooksellers table
-in the Koha database. It must contain entries for all of the fields.
-The entry to modify is determined by C<$bookseller-E<gt>{id}>.
-
-The easiest way to get all of the necessary fields is to look up a
-book seller with C<&booksellers>, modify what's necessary, then call
-C<&updatesup> with the result.
-
-=cut
-
-#'
-sub updatesup {
-    my ($data) = @_;
+sub GetRecentAcqui {
+    my $limit  = shift;
     my $dbh    = C4::Context->dbh;
-    my $sth    = $dbh->prepare(
-        "Update aqbooksellers set
-   name=?,address1=?,address2=?,address3=?,address4=?,postal=?,
-   phone=?,fax=?,url=?,contact=?,contpos=?,contphone=?,contfax=?,contaltphone=?,
-   contemail=?,contnotes=?,active=?,
-   listprice=?, invoiceprice=?,gstreg=?, listincgst=?,
-   invoiceincgst=?, specialty=?,discount=?,invoicedisc=?,
-   nocalc=?, notes=?
-   where id=?");
-   $sth->execute($data->{'name'},$data->{'address1'},$data->{'address2'},
-   $data->{'address3'},$data->{'address4'},$data->{'postal'},$data->{'phone'},
-   $data->{'fax'},$data->{'url'},$data->{'contact'},$data->{'contpos'},
-   $data->{'contphone'},$data->{'contfax'},$data->{'contaltphone'},
-   $data->{'contemail'},
-   $data->{'contnotes'},$data->{'active'},$data->{'listprice'},
-   $data->{'invoiceprice'},$data->{'gstreg'},$data->{'listincgst'},
-   $data->{'invoiceincgst'},$data->{'specialty'},$data->{'discount'},
-   $data->{'invoicedisc'},$data->{'nocalc'},$data->{'notes'},$data->{'id'});
-   $sth->finish;
-}
-
-=item insertsup
-
-  $id = &insertsup($bookseller);
-
-Creates a new bookseller. C<$bookseller> is a reference-to-hash whose
-keys are the fields of the aqbooksellers table in the Koha database.
-All fields must be present.
-
-Returns the ID of the newly-created bookseller.
+    my $query = "
+        SELECT *
+        FROM   biblio
+        ORDER BY timestamp DESC
+        LIMIT  0,".$limit;
 
-=cut
-
-#'
-sub insertsup {
-    my ($data) = @_;
-    my $dbh    = C4::Context->dbh;
-    my $sth    = $dbh->prepare("Select max(id) from aqbooksellers");
-    $sth->execute;
-    my $data2 = $sth->fetchrow_hashref;
-    $sth->finish;
-    $data2->{'max(id)'}++;
-    $sth = $dbh->prepare("Insert into aqbooksellers (id) values (?)");
-    $sth->execute( $data2->{'max(id)'} );
-    $sth->finish;
-    $data->{'id'} = $data2->{'max(id)'};
-    updatesup($data);
-    return ( $data->{'id'} );
-}
-
-=item getparcels
-
-  ($count, $results) = &getparcels($dbh, $bookseller, $order, $limit);
-
-get a lists of parcels
-Returns the count of parcels returned and a pointer on a hash list containing parcel informations as such :
-               Creation date
-               Last operation
-               Number of biblio
-               Number of items
-               
-
-=cut
-
-#'
-sub getparcels {
-    my ( $bookseller, $order, $code, $datefrom, $dateto, $limit ) = @_;
-    my $dbh    = C4::Context->dbh;
-    my $strsth =
-"SELECT aqorders.booksellerinvoicenumber, datereceived, count(DISTINCT biblionumber) as biblio, sum(quantity) as itemsexpected, sum(quantityreceived) as itemsreceived from aqorders, aqbasket where aqbasket.basketno = aqorders.basketno and aqbasket.booksellerid = $bookseller and datereceived is not null ";
-    $strsth .= "and aqorders.booksellerinvoicenumber like \"$code%\" "
-      if ($code);
-    $strsth .= "and datereceived >=" . $dbh->quote($datefrom) . " "
-      if ($datefrom);
-    $strsth .= "and datereceived <=" . $dbh->quote($dateto) . " " if ($dateto);
-    $strsth .= "group by aqorders.booksellerinvoicenumber,datereceived ";
-    $strsth .= "order by $order " if ($order);
-    $strsth .= " LIMIT 0,$limit" if ($limit);
-    my $sth = $dbh->prepare($strsth);
-###    getparcels:  $strsth
+    my $sth = $dbh->prepare($query);
     $sth->execute;
     my @results;
-
-    while ( my $data2 = $sth->fetchrow_hashref ) {
-        push @results, $data2;
+    while(my $data = $sth->fetchrow_hashref){
+        push @results,$data;
     }
-
-    $sth->finish;
-    return ( scalar(@results), @results );
-}
-
-=item getparcels
-
-  ($count, $results) = &getparcels($dbh, $bookseller, $order, $limit);
-
-get a lists of parcels
-Returns the count of parcels returned and a pointer on a hash list containing parcel informations as such :
-               Creation date
-               Last operation
-               Number of biblio
-               Number of items
-               
-
-=cut
-#'
-sub getparcels {
-  my ($bookseller, $order, $code,$datefrom,$dateto, $limit)=@_;
-       my $dbh = C4::Context->dbh;
-       my $strsth = "SELECT aqorders.booksellerinvoicenumber, datereceived, count(DISTINCT biblionumber) as biblio, sum(quantity) as itemsexpected, sum(quantityreceived) as itemsreceived from aqorders, aqbasket where aqbasket.basketno = aqorders.basketno and aqbasket.booksellerid = $bookseller and datereceived is not null ";
-       $strsth .= "and aqorders.booksellerinvoicenumber like \"$code%\" " if ($code);
-       $strsth .= "and datereceived >=".$dbh->quote($datefrom)." " if ($datefrom);
-       $strsth .= "and datereceived <=".$dbh->quote($dateto)." " if ($dateto);
-       $strsth .= "group by aqorders.booksellerinvoicenumber,datereceived ";
-       $strsth .= "order by $order " if ($order);
-       $strsth .= " LIMIT 0,$limit" if ($limit);
-       my $sth=$dbh->prepare($strsth);
-###    getparcels:  $strsth
-       $sth->execute;
-       my @results;
-       while (my $data2=$sth->fetchrow_hashref) {
-               push @results, $data2;
-       }
-       
-   $sth->finish;
-   return(scalar(@results), @results);
+    return \@results;
 }
 
-END { }       # module clean-up code here (global destructor)
-
 1;
 __END__
 
-=back
-
 =head1 AUTHOR
 
 Koha Developement team <info@koha.org>