[Koha-patches] [PATCH 2/2] Bug 5339: Invoices management improvement

julian.maurice at biblibre.com julian.maurice at biblibre.com
Thu Feb 16 16:04:16 CET 2012


From: Julian Maurice <julian.maurice at biblibre.com>

- New pages:
  - invoices.pl: allow to search in invoices on several criteria
  - invoice.pl: permit to view and modify invoice details
    - shipment date
    - billing date
    - shipment cost and budget used for shipment cost

Invoice informations are now stored in their own sql table and aqorders
have a link to it
---
 C4/Acquisition.pm                                  |  354 +++++++++++++++++++-
 C4/Budgets.pm                                      |   24 ++-
 acqui/finishreceive.pl                             |   12 +-
 acqui/invoice.pl                                   |  211 ++++++++++++
 acqui/invoices.pl                                  |  150 +++++++++
 acqui/orderreceive.pl                              |   32 +-
 acqui/parcel.pl                                    |  251 +++++++--------
 acqui/parcels.pl                                   |   48 ++-
 .../prog/en/includes/acquisitions-menu.inc         |    1 +
 .../intranet-tmpl/prog/en/modules/acqui/invoice.tt |  182 ++++++++++
 .../prog/en/modules/acqui/invoices.tt              |  223 ++++++++++++
 .../prog/en/modules/acqui/orderreceive.tt          |    7 +-
 .../intranet-tmpl/prog/en/modules/acqui/parcel.tt  |  208 ++++++------
 .../intranet-tmpl/prog/en/modules/acqui/parcels.tt |   48 ++--
 14 files changed, 1453 insertions(+), 298 deletions(-)
 create mode 100755 acqui/invoice.pl
 create mode 100755 acqui/invoices.pl
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt

diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm
index 0a96a02..df212c6 100644
--- a/C4/Acquisition.pm
+++ b/C4/Acquisition.pm
@@ -61,6 +61,14 @@ BEGIN {
         &GetParcels &GetParcel
         &GetContracts &GetContract
 
+        &GetInvoices
+        &GetInvoice
+        &GetInvoiceDetails
+        &AddInvoice
+        &ModInvoice
+        &CloseInvoice
+        &ReopenInvoice
+
         &GetItemnumbersFromOrder
 
         &AddClaim
@@ -1103,7 +1111,7 @@ C<$ordernumber>.
 sub ModReceiveOrder {
     my (
         $biblionumber,    $ordernumber,  $quantrec, $user, $cost,
-        $invoiceno, $freight, $rrp, $budget_id, $datereceived
+        $invoiceid, $rrp, $budget_id, $datereceived
     )
     = @_;
     my $dbh = C4::Context->dbh;
@@ -1129,14 +1137,13 @@ sub ModReceiveOrder {
             UPDATE aqorders
             SET quantityreceived=?
                 , datereceived=?
-                , booksellerinvoicenumber=?
+                , invoiceid=?
                 , unitprice=?
-                , freight=?
                 , rrp=?
                 , quantity=?
             WHERE biblionumber=? AND ordernumber=?");
 
-        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$quantrec,$biblionumber,$ordernumber);
+        $sth->execute($quantrec,$datereceived,$invoiceid,$cost,$rrp,$quantrec,$biblionumber,$ordernumber);
         $sth->finish;
 
         # create a new order for the remaining items, and set its bookfund.
@@ -1148,10 +1155,10 @@ sub ModReceiveOrder {
         my $newOrder = NewOrder($order);
 } else {
         $sth=$dbh->prepare("update aqorders
-                            set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
-                                unitprice=?,freight=?,rrp=?
+                            set quantityreceived=?,datereceived=?,invoiceid=?,
+                                unitprice=?,rrp=?
                             where biblionumber=? and ordernumber=?");
-        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
+        $sth->execute($quantrec,$datereceived,$invoiceid,$cost,$rrp,$biblionumber,$ordernumber);
         $sth->finish;
     }
     return $datereceived;
@@ -1801,7 +1808,340 @@ sub AddClaim {
         ";
     my $sth = $dbh->prepare($query);
     $sth->execute($ordernumber);
+}
+
+=head3 GetInvoices
+
+    my @invoices = GetInvoices(
+        invoicenumber => $invoicenumber,
+        suppliername => $suppliername,
+        shipmentdatefrom => $shipmentdatefrom, # ISO format
+        shipmentdateto => $shipmentdateto, # ISO format
+        billingdatefrom => $billingdatefrom, # ISO format
+        billingdateto => $billingdateto, # ISO format
+        isbneanissn => $isbn_or_ean_or_issn,
+        title => $title,
+        author => $author,
+        publisher => $publisher,
+        publicationyear => $publicationyear,
+        branchcode => $branchcode,
+        order_by => $order_by
+    );
+
+Return a list of invoices that match all given criteria.
+
+$order_by is "column_name (asc|desc)", where column_name is any of
+'invoicenumber', 'booksellerid', 'shipmentdate', 'billingdate', 'closedate',
+'shipmentcost', 'shipmentcost_budgetid'.
+
+asc is the default if omitted
+
+=cut
+
+sub GetInvoices {
+    my %args = @_;
+
+    my @columns = qw(invoicenumber booksellerid shipmentdate billingdate
+        closedate shipmentcost shipmentcost_budgetid);
+
+    my $dbh = C4::Context->dbh;
+    my $query = qq{
+        SELECT aqinvoices.*, aqbooksellers.name AS suppliername,
+          COUNT(
+            DISTINCT IF(
+              aqorders.datereceived IS NOT NULL,
+              aqorders.biblionumber,
+              NULL
+            )
+          ) AS receivedbiblios,
+          SUM(aqorders.quantityreceived) AS receiveditems
+        FROM aqinvoices
+          LEFT JOIN aqbooksellers ON aqbooksellers.id = aqinvoices.booksellerid
+          LEFT JOIN aqorders ON aqorders.invoiceid = aqinvoices.invoiceid
+          LEFT JOIN biblio ON aqorders.biblionumber = biblio.biblionumber
+          LEFT JOIN biblioitems ON biblio.biblionumber = biblioitems.biblionumber
+          LEFT JOIN subscription ON biblio.biblionumber = subscription.biblionumber
+    };
+
+    my @bind_args;
+    my @bind_strs;
+    if($args{invoicenumber}) {
+        push @bind_strs, " aqinvoices.invoicenumber LIKE ? ";
+        push @bind_args, "%$args{invoicenumber}%";
+    }
+    if($args{suppliername}) {
+        push @bind_strs, " aqbooksellers.name LIKE ? ";
+        push @bind_args, "%$args{suppliername}%";
+    }
+    if($args{shipmentdatefrom}) {
+        push @bind_strs, " aqinvoices.shipementdate >= ? ";
+        push @bind_args, $args{shipementdatefrom};
+    }
+    if($args{shipmentdateto}) {
+        push @bind_strs, " aqinvoices.shipementdate <= ? ";
+        push @bind_args, $args{shipementdateto};
+    }
+    if($args{billingdatefrom}) {
+        push @bind_strs, " aqinvoices.billingdate >= ? ";
+        push @bind_args, $args{billingdatefrom};
+    }
+    if($args{billingdateto}) {
+        push @bind_strs, " aqinvoices.billingdate <= ? ";
+        push @bind_args, $args{billingdateto};
+    }
+    if($args{isbneanissn}) {
+        push @bind_strs, " (biblioitems.isbn LIKE ? OR biblioitems.ean LIKE ? OR biblioitems.issn LIKE ? ) ";
+        push @bind_args, $args{isbneanissn}, $args{isbneanissn}, $args{isbneanissn};
+    }
+    if($args{title}) {
+        push @bind_strs, " biblio.title LIKE ? ";
+        push @bind_args, $args{title};
+    }
+    if($args{author}) {
+        push @bind_strs, " biblio.author LIKE ? ";
+        push @bind_args, $args{author};
+    }
+    if($args{publisher}) {
+        push @bind_strs, " biblioitems.publishercode LIKE ? ";
+        push @bind_args, $args{publisher};
+    }
+    if($args{publicationyear}) {
+        push @bind_strs, " biblioitems.publicationyear = ? ";
+        push @bind_args, $args{publicationyear};
+    }
+    if($args{branchcode}) {
+        push @bind_strs, " aqorders.branchcode = ? ";
+        push @bind_args, $args{branchcode};
+    }
+
+    $query .= " WHERE " . join(" AND ", @bind_strs) if @bind_strs;
+    $query .= " GROUP BY aqinvoices.invoiceid ";
+
+    if($args{order_by}) {
+        my ($column, $direction) = split / /, $args{order_by};
+        if(grep /^$column$/, @columns) {
+            $direction ||= 'ASC';
+            $query .= " ORDER BY $column $direction";
+        }
+    }
+
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@bind_args);
+
+    my $results = $sth->fetchall_arrayref({});
+    return @$results;
+}
+
+=head3 GetInvoice
+
+    my $invoice = GetInvoice($invoiceid);
+
+Get informations about invoice with given $invoiceid
+
+Return a hash filled with aqinvoices.* fields
+
+=cut
+
+sub GetInvoice {
+    my ($invoiceid) = @_;
+    my $invoice;
+
+    return unless $invoiceid;
+
+    my $dbh = C4::Context->dbh;
+    my $query = qq{
+        SELECT *
+        FROM aqinvoices
+        WHERE invoiceid = ?
+    };
+    my $sth = $dbh->prepare($query);
+    $sth->execute($invoiceid);
+
+    $invoice = $sth->fetchrow_hashref;
+    return $invoice;
+}
+
+=head3 GetInvoiceDetails
+
+    my $invoice = GetInvoiceDetails($invoiceid)
+
+Return informations about an invoice + the list of related order lines
+
+Orders informations are in $invoice->{orders} (array ref)
+
+=cut
+
+sub GetInvoiceDetails {
+    my ($invoiceid) = @_;
+    my $invoice;
+
+    return unless $invoiceid;
+
+    my $dbh = C4::Context->dbh;
+    my $query = qq{
+        SELECT aqinvoices.*, aqbooksellers.name AS suppliername
+        FROM aqinvoices
+          LEFT JOIN aqbooksellers ON aqinvoices.booksellerid = aqbooksellers.id
+        WHERE invoiceid = ?
+    };
+    my $sth = $dbh->prepare($query);
+    $sth->execute($invoiceid);
+
+    $invoice = $sth->fetchrow_hashref;
 
+    $query = qq{
+        SELECT aqorders.*, biblio.*
+        FROM aqorders
+          LEFT JOIN biblio ON aqorders.biblionumber = biblio.biblionumber
+        WHERE invoiceid = ?
+    };
+    $sth = $dbh->prepare($query);
+    $sth->execute($invoiceid);
+    $invoice->{orders} = $sth->fetchall_arrayref({});
+
+    return $invoice;
+}
+
+=head3 AddInvoice
+
+    my $invoiceid = AddInvoice(
+        invoicenumber => $invoicenumber,
+        booksellerid => $booksellerid,
+        shipmentdate => $shipmentdate,
+        billingdate => $billingdate,
+        closedate => $closedate,
+        shipmentcost => $shipmentcost,
+        shipmentcost_budgetid => $shipmentcost_budgetid
+    );
+
+Create a new invoice and return its id or undef if it fails.
+
+=cut
+
+sub AddInvoice {
+    my %invoice = @_;
+
+    return unless(%invoice and $invoice{invoicenumber});
+
+    my @columns = qw(invoicenumber booksellerid shipmentdate billingdate
+        closedate shipmentcost shipmentcost_budgetid);
+
+    my @set_strs;
+    my @set_args;
+    foreach my $key (keys %invoice) {
+        if(0 < grep(/^$key$/, @columns)) {
+            push @set_strs, "$key = ?";
+            push @set_args, ($invoice{$key} || undef);
+        }
+    }
+
+    my $rv;
+    if(@set_args > 0) {
+        my $dbh = C4::Context->dbh;
+        my $query = "INSERT INTO aqinvoices SET ";
+        $query .= join (",", @set_strs);
+        my $sth = $dbh->prepare($query);
+        $rv = $sth->execute(@set_args);
+        if($rv) {
+            $rv = $dbh->last_insert_id(undef, undef, 'aqinvoices', undef);
+        }
+    }
+    return $rv;
+}
+
+=head3 ModInvoice
+
+    ModInvoice(
+        invoiceid => $invoiceid,    # Mandatory
+        invoicenumber => $invoicenumber,
+        booksellerid => $booksellerid,
+        shipmentdate => $shipmentdate,
+        billingdate => $billingdate,
+        closedate => $closedate,
+        shipmentcost => $shipmentcost,
+        shipmentcost_budgetid => $shipmentcost_budgetid
+    );
+
+Modify an invoice, invoiceid is mandatory.
+
+Return undef if it fails.
+
+=cut
+
+sub ModInvoice {
+    my %invoice = @_;
+
+    return unless(%invoice and $invoice{invoiceid});
+
+    my @columns = qw(invoicenumber booksellerid shipmentdate billingdate
+        closedate shipmentcost shipmentcost_budgetid);
+
+    my @set_strs;
+    my @set_args;
+    foreach my $key (keys %invoice) {
+        if(0 < grep(/^$key$/, @columns)) {
+            push @set_strs, "$key = ?";
+            push @set_args, ($invoice{$key} || undef);
+        }
+    }
+
+    my $dbh = C4::Context->dbh;
+    my $query = "UPDATE aqinvoices SET ";
+    $query .= join(",", @set_strs);
+    $query .= " WHERE invoiceid = ?";
+
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@set_args, $invoice{invoiceid});
+}
+
+=head3 CloseInvoice
+
+    CloseInvoice($invoiceid);
+
+Close an invoice.
+
+Equivalent to ModInvoice(invoiceid => $invoiceid, closedate => undef);
+
+=cut
+
+sub CloseInvoice {
+    my ($invoiceid) = @_;
+
+    return unless $invoiceid;
+
+    my $dbh = C4::Context->dbh;
+    my $query = qq{
+        UPDATE aqinvoices
+        SET closedate = CAST(NOW() AS DATE)
+        WHERE invoiceid = ?
+    };
+    my $sth = $dbh->prepare($query);
+    $sth->execute($invoiceid);
+}
+
+=head3 ReopenInvoice
+
+    ReopenInvoice($invoiceid);
+
+Reopen an invoice
+
+Equivalent to ModInvoice(invoiceid => $invoiceid, closedate => C4::Dates->new()->output('iso'))
+
+=cut
+
+sub ReopenInvoice {
+    my ($invoiceid) = @_;
+
+    return unless $invoiceid;
+
+    my $dbh = C4::Context->dbh;
+    my $query = qq{
+        UPDATE aqinvoices
+        SET closedate = NULL
+        WHERE invoiceid = ?
+    };
+    my $sth = $dbh->prepare($query);
+    $sth->execute($invoiceid);
 }
 
 1;
diff --git a/C4/Budgets.pm b/C4/Budgets.pm
index 7c867e0..e4aa889 100644
--- a/C4/Budgets.pm
+++ b/C4/Budgets.pm
@@ -309,9 +309,19 @@ sub GetBudgetSpent {
             quantityreceived > 0 AND
             datecancellationprinted IS NULL
     |);
-
 	$sth->execute($budget_id);
 	my $sum =  $sth->fetchrow_array;
+
+    $sth = $dbh->prepare(qq|
+        SELECT SUM(shipmentcost) AS sum
+        FROM aqinvoices
+        WHERE shipmentcost_budgetid = ?
+          AND closedate IS NOT NULL
+    |);
+    $sth->execute($budget_id);
+    my ($shipmentcost_sum) = $sth->fetchrow_array;
+    $sum += $shipmentcost_sum;
+
 	return $sum;
 }
 
@@ -325,9 +335,19 @@ sub GetBudgetOrdered {
             quantityreceived = 0 AND
             datecancellationprinted IS NULL
     |);
-
 	$sth->execute($budget_id);
 	my $sum =  $sth->fetchrow_array;
+
+    $sth = $dbh->prepare(qq|
+        SELECT SUM(shipmentcost) AS sum
+        FROM aqinvoices
+        WHERE shipmentcost_budgetid = ?
+          AND closedate IS NULL
+    |);
+    $sth->execute($budget_id);
+    my ($shipmentcost_sum) = $sth->fetchrow_array;
+    $sum += $shipmentcost_sum;
+
 	return $sum;
 }
 
diff --git a/acqui/finishreceive.pl b/acqui/finishreceive.pl
index 0f2f070..f83b7d0 100755
--- a/acqui/finishreceive.pl
+++ b/acqui/finishreceive.pl
@@ -43,14 +43,14 @@ my $origquantityrec=$input->param('origquantityrec');
 my $quantityrec=$input->param('quantityrec');
 my $quantity=$input->param('quantity');
 my $unitprice=$input->param('cost');
-my $invoiceno=$input->param('invoice');
-my $datereceived=$input->param('datereceived');
+my $invoiceid = $input->param('invoiceid');
+my $invoice = GetInvoice($invoiceid);
+my $invoiceno = $invoice->{invoicenumber};
+my $datereceived= $invoice->{shipmentdate};
 my $replacement=$input->param('rrp');
 my $gst=$input->param('gst');
-my $freight=$input->param('freight');
 my $supplierid = $input->param('supplierid');
 my $cnt=0;
-my $error_url_str;
 my $ecost = $input->param('ecost');
 my $note = $input->param("note");
 
@@ -94,12 +94,12 @@ if ($quantityrec > $origquantityrec ) {
     }
     
     # save the quantity received.
-    $datereceived = ModReceiveOrder($biblionumber,$ordernumber, $quantityrec ,$user,$unitprice,$invoiceno,$freight,$replacement,undef,$datereceived);
+    $datereceived = ModReceiveOrder($biblionumber,$ordernumber, $quantityrec ,$user,$unitprice,$invoice->{invoiceid},$replacement,undef,$datereceived);
 }
 
 update_item( $_ ) foreach GetItemnumbersFromOrder( $ordernumber );
 
-print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoice=$invoiceno&supplierid=$supplierid&freight=$freight&gst=$gst&datereceived=$datereceived$error_url_str");
+print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid");
 
 ################################ End of script ################################
 
diff --git a/acqui/invoice.pl b/acqui/invoice.pl
new file mode 100755
index 0000000..19579d3
--- /dev/null
+++ b/acqui/invoice.pl
@@ -0,0 +1,211 @@
+#!/usr/bin/perl
+
+# Copyright 2011 BibLibre SARL
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+=head1 NAME
+
+invoice.pl
+
+=head1 DESCRIPTION
+
+Invoice details
+
+=cut
+
+use strict;
+use warnings;
+
+use CGI;
+use C4::Auth;
+use C4::Output;
+use C4::Acquisition;
+use C4::Bookseller qw/GetBookSellerFromId/;
+use C4::Budgets;
+
+my $input = new CGI;
+my ($template, $loggedinuser, $cookie, $flags) = get_template_and_user( {
+    template_name   => 'acqui/invoice.tmpl',
+    query           => $input,
+    type            => 'intranet',
+    authnotrequired => 0,
+    flagsrequired   => { 'acquisition' => '*' },
+    debug           => 1,
+} );
+
+my $invoiceid = $input->param('invoiceid');
+my $op = $input->param('op');
+
+if($op && $op eq 'close') {
+    CloseInvoice($invoiceid);
+    my $referer = $input->param('referer');
+    if($referer) {
+        print $input->redirect($referer);
+        exit 0;
+    }
+}elsif($op && $op eq 'reopen') {
+    ReopenInvoice($invoiceid);
+    my $referer = $input->param('referer');
+    if($referer) {
+        print $input->redirect($referer);
+        exit 0;
+    }
+}elsif($op && $op eq 'mod') {
+    my $shipmentdate = $input->param('shipmentdate');
+    my $billingdate = $input->param('billingdate');
+    my $shipmentcost = $input->param('shipmentcost');
+    my $shipment_budget_id = $input->param('shipment_budget_id');
+    ModInvoice(
+        invoiceid => $invoiceid,
+        shipmentdate   => C4::Dates->new($shipmentdate)->output("iso"),
+        billingdate   => C4::Dates->new($billingdate)->output("iso"),
+        shipmentcost  => $shipmentcost,
+        shipmentcost_budgetid => $shipment_budget_id
+    );
+    $template->param(modified => 1);
+}
+
+my $details = GetInvoiceDetails($invoiceid);
+my $bookseller = GetBookSellerFromId($details->{booksellerid});
+my @orders_loop = ();
+my $orders = $details->{'orders'};
+my $qty_total;
+my @books_loop;
+my @book_foot_loop;
+my %foot;
+my $total_quantity = 0;
+my $total_rrp = 0;
+my $total_est = 0;
+foreach my $order (@$orders) {
+    my $line = get_infos( $order, $bookseller);
+
+    $total_quantity += $$line{quantity};
+    $total_rrp += $order->{quantity} * $order->{rrp};
+    $total_est += $order->{quantity} * $order->{'ecost'};
+
+    my %row = (%$order, %$line);
+    push @orders_loop, \%row;
+}
+
+my $gist = $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
+my $discount = $bookseller->{'discount'} ? ($bookseller->{discount} / 100) : 0;
+my $total_est_gste;
+my $total_est_gsti;
+my $total_rrp_gsti; # RRP Total, GST included
+my $total_rrp_gste; # RRP Total, GST excluded
+my $gist_est;
+my $gist_rrp;
+if ($gist){
+    # if we have GST
+    if ( $bookseller->{'listincgst'} ) {
+        # if prices already includes GST
+
+        # we know $total_rrp_gsti
+        $total_rrp_gsti = $total_rrp;
+        # and can reverse compute other values
+        $total_rrp_gste = $total_rrp_gsti / ( $gist + 1 );
+
+        $gist_rrp       = $total_rrp_gsti - $total_rrp_gste;
+        $total_est_gste = $total_rrp_gste - ( $total_rrp_gste * $discount );
+        $total_est_gsti = $total_est;
+    } else {
+        # if prices does not include GST
+
+        # then we use the common way to compute other values
+        $total_rrp_gste = $total_rrp;
+        $gist_rrp       = $total_rrp_gste * $gist;
+        $total_rrp_gsti = $total_rrp_gste + $gist_rrp;
+        $total_est_gste = $total_est;
+        $total_est_gsti = $total_rrp_gsti - ( $total_rrp_gsti * $discount );
+   }
+   $gist_est = $gist_rrp - ( $gist_rrp * $discount );
+} else {
+    $total_rrp_gsti = $total_rrp;
+    $total_est_gsti = $total_est;
+}
+my $total_gsti_shipment = $total_est_gsti + $details->{shipmentcost};
+
+my $format = "%.2f";
+$template->param(
+    total_rrp_gste => sprintf($format, $total_rrp_gste),
+    total_rrp_gsti => sprintf($format, $total_rrp_gsti),
+    total_est_gste => sprintf($format, $total_est_gste),
+    total_est_gsti => sprintf($format, $total_est_gsti),
+    gist_rrp => sprintf($format, $gist_rrp),
+    gist_est => sprintf($format, $gist_est),
+    total_gsti_shipment => sprintf($format, $total_gsti_shipment),
+    gist => sprintf($format, $gist * 100),
+);
+
+my $budgets = GetBudgets();
+my @budgets_loop;
+my $shipmentcost_budgetid = $details->{shipmentcost_budgetid};
+foreach (@$budgets) {
+    my %line = %{ $_ };
+    if($shipmentcost_budgetid and $_->{'budget_id'} == $shipmentcost_budgetid) {
+        $line{'selected'} = 1;
+    }
+    push @budgets_loop, \%line;
+}
+
+$template->param(
+    invoiceid        => $details->{'invoiceid'},
+    invoicenumber    => $details->{'invoicenumber'},
+    suppliername     => $details->{'suppliername'},
+    supplierid       => $details->{'booksellerid'},
+    datereceived     => $details->{'datereceived'},
+    shipmentdate     => $details->{'shipmentdate'},
+    billingdate      => $details->{'billingdate'},
+    invoiceclosedate => $details->{'closedate'},
+    shipmentcost     => sprintf($format, $details->{'shipmentcost'} || 0),
+    orders_loop      => \@orders_loop,
+    total_quantity   => $total_quantity,
+    invoiceincgst    => $bookseller->{invoiceincgst},
+    currency         => $bookseller->{listprice},
+    DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+    budgets_loop     => \@budgets_loop,
+);
+
+sub get_infos {
+    my $order = shift;
+    my $bookseller = shift;
+    my $qty = $order->{'quantity'} || 0;
+    if ( !defined $order->{quantityreceived} ) {
+        $order->{quantityreceived} = 0;
+    }
+    my $budget = GetBudget( $order->{'budget_id'} );
+
+    my %line = %{ $order };
+    $line{order_received} = ( $qty == $order->{'quantityreceived'} );
+    $line{budget_name}    = $budget->{budget_name};
+    $line{total} = $qty * $order->{ecost};
+
+    if ( $line{uncertainprice} ) {
+        $line{rrp} .= ' (Uncertain)';
+    }
+    if ( $line{'title'} ) {
+        my $volume      = $order->{'volume'};
+        my $seriestitle = $order->{'seriestitle'};
+        $line{'title'} .= " / $seriestitle" if $seriestitle;
+        $line{'title'} .= " / $volume"      if $volume;
+    } else {
+        $line{'title'} = "Deleted bibliographic notice, can't find title.";
+    }
+
+    return \%line;
+}
+
+output_html_with_http_headers $input, $cookie, $template->output;
diff --git a/acqui/invoices.pl b/acqui/invoices.pl
new file mode 100755
index 0000000..3ca0f01
--- /dev/null
+++ b/acqui/invoices.pl
@@ -0,0 +1,150 @@
+#!/usr/bin/perl
+
+# Copyright 2011 BibLibre SARL
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+=head1 NAME
+
+invoices.pl
+
+=head1 DESCRIPTION
+
+Search for invoices
+
+=cut
+
+use strict;
+use warnings;
+
+use CGI;
+use C4::Auth;
+use C4::Output;
+
+use C4::Acquisition;
+use C4::Bookseller qw/GetBookSeller/;
+use C4::Branch;
+
+my $input = new CGI;
+my ($template, $loggedinuser, $cookie, $flags) = get_template_and_user( {
+    template_name   => 'acqui/invoices.tmpl',
+    query           => $input,
+    type            => 'intranet',
+    authnotrequired => 0,
+    flagsrequired   => { 'acquisition' => '*' },
+    debug           => 1,
+} );
+
+my $invoicenumber   = $input->param('invoicenumber');
+my $supplier        = $input->param('supplier');
+my $billingdatefrom = $input->param('billingdatefrom');
+my $billingdateto   = $input->param('billingdateto');
+my $isbneanissn     = $input->param('isbneanissn');
+my $title           = $input->param('title');
+my $author          = $input->param('author');
+my $publisher       = $input->param('publisher');
+my $publicationyear = $input->param('publicationyear');
+my $branch          = $input->param('branch');
+my $op              = $input->param('op');
+
+my @results_loop = ();
+if($op and $op eq "do_search") {
+    my $billingdatefrom_iso = C4::Dates->new($billingdatefrom)->output("iso");
+    my $billingdateto_iso = C4::Dates->new($billingdateto)->output("iso");
+    my @invoices = GetInvoices(
+        invoicenumber => $invoicenumber,
+        suppliername => $supplier,
+        billingdatefrom => $billingdatefrom_iso,
+        billingdateto => $billingdateto_iso,
+        isbneanissn => $isbneanissn,
+        title => $title,
+        author => $author,
+        publisher => $publisher,
+        publicationyear => $publicationyear,
+        branchcode => $branch
+    );
+    foreach (@invoices) {
+        my %row = (
+            invoiceid       => $_->{invoiceid},
+            billingdate     => $_->{billingdate},
+            invoicenumber   => $_->{invoicenumber},
+            suppliername    => $_->{suppliername},
+            receivedbiblios => $_->{receivedbiblios},
+            receiveditems   => $_->{receiveditems},
+            subscriptionid  => $_->{subscriptionid},
+            closedate => $_->{closedate},
+        );
+        push @results_loop, \%row;
+    }
+}
+
+
+# Build suppliers list
+my @suppliers = GetBookSeller(undef);
+my @suppliers_loop = ();
+my $suppliername;
+foreach (@suppliers) {
+    my $selected = 0;
+    if ($supplier && $supplier == $_->{'id'}) {
+        $selected = 1;
+        $suppliername = $_->{'name'};
+    }
+    my %row = (
+        suppliername => $_->{'name'},
+        supplierid   => $_->{'id'},
+        selected     => $selected,
+    );
+    push @suppliers_loop, \%row;
+}
+
+# Build branches list
+my $branches = GetBranches();
+my @branches_loop = ();
+my $branchname;
+foreach (sort keys %$branches) {
+    my $selected = 0;
+    if ($branch && $branch eq $_) {
+        $selected = 1;
+        $branchname = $branches->{$_}->{'branchname'};
+    }
+    my %row = (
+        branchcode => $_,
+        branchname => $branches->{$_}->{'branchname'},
+        selected   => $selected,
+    );
+    push @branches_loop, \%row;
+}
+
+$template->param(
+    do_search       => ($op and $op eq "do_search") ? 1 : 0,
+    results_loop    => \@results_loop,
+    invoicenumber   => $invoicenumber,
+    supplier        => $supplier,
+    suppliername    => $suppliername,
+    billingdatefrom => $billingdatefrom,
+    billingdateto   => $billingdateto,
+    isbneanissn     => $isbneanissn,
+    title           => $title,
+    author          => $author,
+    publisher       => $publisher,
+    publicationyear => $publicationyear,
+    branch          => $branch,
+    branchname      => $branchname,
+    suppliers_loop  => \@suppliers_loop,
+    branches_loop   => \@branches_loop,
+    DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+);
+
+output_html_with_http_headers $input, $cookie, $template->output;
diff --git a/acqui/orderreceive.pl b/acqui/orderreceive.pl
index 753071d..77e2149 100755
--- a/acqui/orderreceive.pl
+++ b/acqui/orderreceive.pl
@@ -40,9 +40,9 @@ to know on what supplier this script has to display receive order.
 
 =item receive
 
-=item invoice
+=item invoiceid
 
-the number of this invoice.
+the id of this invoice.
 
 =item freight
 
@@ -61,7 +61,8 @@ The biblionumber of this order.
 =cut
 
 use strict;
-#use warnings; FIXME - Bug 2505
+use warnings;
+
 use CGI;
 use C4::Context;
 use C4::Koha;   # GetKohaAuthorisedValues GetItemTypes
@@ -80,26 +81,23 @@ use C4::Biblio;
 my $input      = new CGI;
 
 my $dbh          = C4::Context->dbh;
-my $supplierid   = $input->param('supplierid');
-my $ordernumber       = $input->param('ordernumber');
+my $invoiceid    = $input->param('invoiceid');
+my $invoice      = GetInvoice($invoiceid);
+my $supplierid   = $invoice->{booksellerid};
+my $freight      = $invoice->{shipmentcost};
+my $datereceived = $invoice->{shipmentdate};
+my $ordernumber  = $input->param('ordernumber');
 my $search       = $input->param('receive');
-my $invoice      = $input->param('invoice');
-my $freight      = $input->param('freight');
-my $datereceived = $input->param('datereceived');
-
 
 $datereceived = $datereceived ? C4::Dates->new($datereceived, 'iso') : C4::Dates->new();
 
 my $bookseller = GetBookSellerFromId($supplierid);
-my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
-my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
+my $gst = $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
 my $results = SearchOrder($ordernumber,$search);
 
-
 my $count   = scalar @$results;
 my $order 	= GetOrder($ordernumber);
 
-
 my $date = @$results[0]->{'entrydate'};
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
@@ -164,7 +162,8 @@ if ( $count == 1 ) {
         unitprice             => @$results[0]->{'unitprice'},
         memberfirstname       => $member->{firstname} || "",
         membersurname         => $member->{surname} || "",
-        invoice               => $invoice,
+        invoiceid             => $invoice->{invoiceid},
+        invoice               => $invoice->{invoicenumber},
         datereceived          => $datereceived->output(),
         datereceived_iso      => $datereceived->output('iso'),
         notes                 => $order->{notes}
@@ -175,7 +174,7 @@ else {
     for ( my $i = 0 ; $i < $count ; $i++ ) {
         my %line = %{ @$results[$i] };
 
-        $line{invoice}      = $invoice;
+        $line{invoice}      = $invoice->{invoicenumber};
         $line{datereceived} = $datereceived->output();
         $line{freight}      = $freight;
         $line{gst}          = $gst;
@@ -188,10 +187,11 @@ else {
     $template->param(
         loop         => \@loop,
         supplierid   => $supplierid,
+        invoiceid    => $invoice->{invoiceid},
     );
 }
 my $op = $input->param('op');
-if ($op eq 'edit'){
+if ($op and $op eq 'edit'){
     $template->param(edit   =>   1);
 }
 output_html_with_http_headers $input, $cookie, $template->output;
diff --git a/acqui/parcel.pl b/acqui/parcel.pl
index c256c60..a7c792b 100755
--- a/acqui/parcel.pl
+++ b/acqui/parcel.pl
@@ -42,8 +42,6 @@ To know the supplier this script has to show orders.
 
 is the bookseller invoice number.
 
-=item freight
-
 
 =item gst
 
@@ -57,7 +55,8 @@ To filter the results list on this given date.
 =cut
 
 use strict;
-#use warnings; FIXME - Bug 2505
+use warnings;
+
 use C4::Auth;
 use C4::Acquisition;
 use C4::Budgets;
@@ -70,16 +69,13 @@ use C4::Dates qw/format_date format_date_in_iso/;
 use JSON;
 
 my $input=new CGI;
-my $supplierid=$input->param('supplierid');
-my $bookseller=GetBookSellerFromId($supplierid);
-
-my $invoice=$input->param('invoice') || '';
-my $freight=$input->param('freight');
-my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
-my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
-my $datereceived =  ($input->param('op') eq 'new') ? C4::Dates->new($input->param('datereceived')) 
-					:  C4::Dates->new($input->param('datereceived'), 'iso')   ;
-$datereceived = C4::Dates->new() unless $datereceived;
+
+my $invoiceid = $input->param('invoiceid');
+my $invoice = GetInvoiceDetails($invoiceid);
+my $supplierid = $invoice->{booksellerid};
+my $bookseller = GetBookSellerFromId($supplierid);
+my $gst = $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
+my $datereceived = C4::Dates->new();
 my $code            = $input->param('code');
 my @rcv_err         = $input->param('error');
 my @rcv_err_barcode = $input->param('error_bc');
@@ -89,16 +85,17 @@ my $resultsperpage = $input->param('resultsperpage');
 $resultsperpage = 20 unless ($resultsperpage);
 $startfrom=0 unless ($startfrom);
 
-if($input->param('format') eq "json"){
+my $format = $input->param('format') || '';
+if($format eq "json"){
     my ($template, $loggedinuser, $cookie)
         = get_template_and_user({template_name => "acqui/ajax.tmpl",
                  query => $input,
-				 type => "intranet",
+                 type => "intranet",
                  authnotrequired => 0,
                  flagsrequired => {acquisition => 'order_receive'},
                  debug => 1,
     });
-       
+
     my @datas;
     my $search   = $input->param('search') || '';
     my $supplier = $input->param('supplierid') || '';
@@ -109,7 +106,7 @@ if($input->param('format') eq "json"){
     foreach my $order (@$orders){
         if($order->{quantityreceived} < $order->{quantity}){
             my $data = {};
-            
+
             $data->{basketno} = $order->{basketno};
             $data->{ordernumber} = $order->{ordernumber};
             $data->{title} = $order->{title};
@@ -117,14 +114,13 @@ if($input->param('format') eq "json"){
             $data->{isbn} = $order->{isbn};
             $data->{booksellerid} = $order->{booksellerid};
             $data->{biblionumber} = $order->{biblionumber};
-            $data->{freight} = $order->{freight};
             $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;
@@ -134,7 +130,7 @@ if($input->param('format') eq "json"){
 my ($template, $loggedinuser, $cookie)
     = get_template_and_user({template_name => "acqui/parcel.tmpl",
                  query => $input,
-				 type => "intranet",
+                 type => "intranet",
                  authnotrequired => 0,
                  flagsrequired => {acquisition => 'order_receive'},
                  debug => 1,
@@ -154,10 +150,9 @@ if( scalar(@rcv_err) ) {
 }
 
 my $cfstr         = "%.2f";                                                           # currency format string -- could get this from currency table.
-my @parcelitems   = GetParcel($supplierid, $invoice, $datereceived->output('iso'));
+my @parcelitems   = @{ $invoice->{orders} };
 my $countlines    = scalar @parcelitems;
 my $totalprice    = 0;
-my $totalfreight  = 0;
 my $totalquantity = 0;
 my $total;
 my $tototal;
@@ -165,152 +160,144 @@ my @loop_received = ();
 
 for (my $i = 0 ; $i < $countlines ; $i++) {
 
-    #$total=($parcelitems[$i]->{'unitprice'} + $parcelitems[$i]->{'freight'}) * $parcelitems[$i]->{'quantityreceived'};   #weird, are the freight fees counted by book? (pierre)
-    $total = ($parcelitems[$i]->{'unitprice'}) * $parcelitems[$i]->{'quantityreceived'};    #weird, are the freight fees counted by book? (pierre)
+    $total = ($parcelitems[$i]->{'unitprice'}) * $parcelitems[$i]->{'quantityreceived'};
     $parcelitems[$i]->{'unitprice'} += 0;
     my %line;
     %line          = %{ $parcelitems[$i] };
-    $line{invoice} = $invoice;
+    $line{invoice} = $invoice->{invoicenumber};
     $line{gst}     = $gst;
     $line{total} = sprintf($cfstr, $total);
-    $line{supplierid} = $supplierid;
+    $line{supplierid} = $invoice->{booksellerid};
     push @loop_received, \%line;
     $totalprice += $parcelitems[$i]->{'unitprice'};
     $line{unitprice} = sprintf($cfstr, $parcelitems[$i]->{'unitprice'});
 
-    #double FIXME - totalfreight is redefined later.
-
-# FIXME - each order in a  parcel holds the freight for the whole parcel. This means if you receive a parcel with items from multiple budgets, you'll see the freight charge in each budget..
-    if ($i > 0 && $totalfreight != $parcelitems[$i]->{'freight'}) {
-        warn "FREIGHT CHARGE MISMATCH!!";
-    }
-    $totalfreight = $parcelitems[$i]->{'freight'};
     $totalquantity += $parcelitems[$i]->{'quantityreceived'};
     $tototal       += $total;
 }
 
-my $pendingorders = GetPendingOrders($supplierid);
-my $countpendings = scalar @$pendingorders;
-
-# pending orders totals
-my ($totalPunitprice, $totalPquantity, $totalPecost, $totalPqtyrcvd);
-my $ordergrandtotal;
-my @loop_orders = ();
-for (my $i = 0 ; $i < $countpendings ; $i++) {
-    my %line;
-    %line = %{$pendingorders->[$i]};
-   
-    $line{quantity}+=0;
-    $line{quantityreceived}+=0;
-    $line{unitprice}+=0;
-    $totalPunitprice += $line{unitprice};
-    $totalPquantity +=$line{quantity};
-    $totalPqtyrcvd +=$line{quantityreceived};
-    $totalPecost += $line{ecost};
-    $line{ecost} = sprintf("%.2f",$line{ecost});
-    $line{ordertotal} = sprintf("%.2f",$line{ecost}*$line{quantity});
-    $line{unitprice} = sprintf("%.2f",$line{unitprice});
-    $line{invoice} = $invoice;
-    $line{gst} = $gst;
-    $line{total} = $total;
-    $line{supplierid} = $supplierid;
-    $ordergrandtotal += $line{ecost} * $line{quantity};
-    
-    my $biblionumber = $line{'biblionumber'};
-    my $countbiblio = CountBiblioInOrders($biblionumber);
-    my $ordernumber = $line{'ordernumber'};
-    my @subscriptions = GetSubscriptionsId ($biblionumber);
-    my $itemcount = GetItemsCount($biblionumber);
-    my $holds  = GetHolds ($biblionumber);
-    my @items = GetItemnumbersFromOrder( $ordernumber );
-    my $itemholds;
-    foreach my $item (@items){
-        my $nb = GetItemHolds($biblionumber, $item);
-        if ($nb){
-            $itemholds += $nb;
+if(!defined $invoice->{closedate}) {
+    my $pendingorders = GetPendingOrders($supplierid);
+    my $countpendings = scalar @$pendingorders;
+
+    # pending orders totals
+    my ($totalPunitprice, $totalPquantity, $totalPecost, $totalPqtyrcvd);
+    my $ordergrandtotal;
+    my @loop_orders = ();
+    for (my $i = 0 ; $i < $countpendings ; $i++) {
+        my %line;
+        %line = %{$pendingorders->[$i]};
+       
+        $line{quantity}+=0;
+        $line{quantityreceived}+=0;
+        $line{unitprice}+=0;
+        $totalPunitprice += $line{unitprice};
+        $totalPquantity +=$line{quantity};
+        $totalPqtyrcvd +=$line{quantityreceived};
+        $totalPecost += $line{ecost};
+        $line{ecost} = sprintf("%.2f",$line{ecost});
+        $line{ordertotal} = sprintf("%.2f",$line{ecost}*$line{quantity});
+        $line{unitprice} = sprintf("%.2f",$line{unitprice});
+        $line{invoice} = $invoice;
+        $line{gst} = $gst;
+        $line{total} = $total;
+        $line{supplierid} = $supplierid;
+        $ordergrandtotal += $line{ecost} * $line{quantity};
+        
+        my $biblionumber = $line{'biblionumber'};
+        my $countbiblio = CountBiblioInOrders($biblionumber);
+        my $ordernumber = $line{'ordernumber'};
+        my @subscriptions = GetSubscriptionsId ($biblionumber);
+        my $itemcount = GetItemsCount($biblionumber);
+        my $holds  = GetHolds ($biblionumber);
+        my @items = GetItemnumbersFromOrder( $ordernumber );
+        my $itemholds;
+        foreach my $item (@items){
+            my $nb = GetItemHolds($biblionumber, $item);
+            if ($nb){
+                $itemholds += $nb;
+            }
         }
+        
+        # if the biblio is not in other orders and if there is no items elsewhere and no subscriptions and no holds we can then show the link "Delete order and Biblio" see bug 5680
+        $line{can_del_bib}          = 1 if $countbiblio <= 1 && $itemcount == scalar @items && !(@subscriptions) && !($holds);
+        $line{items}                = ($itemcount) - (scalar @items);
+        $line{left_item}            = 1 if $line{items} >= 1;
+        $line{left_biblio}          = 1 if $countbiblio > 1;
+        $line{biblios}              = $countbiblio - 1;
+        $line{left_subscription}    = 1 if scalar @subscriptions >= 1;
+        $line{subscriptions}        = scalar @subscriptions;
+        $line{left_holds}           = ($holds >= 1) ? 1 : 0;
+        $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
+        $line{holds}                = $holds;
+        $line{holds_on_order}       = $itemholds?$itemholds:$holds if $line{left_holds_on_order};
+        
+        
+        push @loop_orders, \%line if ($i >= $startfrom and $i < $startfrom + $resultsperpage);
     }
-    
-    # if the biblio is not in other orders and if there is no items elsewhere and no subscriptions and no holds we can then show the link "Delete order and Biblio" see bug 5680
-    $line{can_del_bib}          = 1 if $countbiblio <= 1 && $itemcount == scalar @items && !(@subscriptions) && !($holds);
-    $line{items}                = ($itemcount) - (scalar @items);
-    $line{left_item}            = 1 if $line{items} >= 1;
-    $line{left_biblio}          = 1 if $countbiblio > 1;
-    $line{biblios}              = $countbiblio - 1;
-    $line{left_subscription}    = 1 if scalar @subscriptions >= 1;
-    $line{subscriptions}        = scalar @subscriptions;
-    $line{left_holds}           = 1 if $holds >= 1;
-    $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
-    $line{holds}                = $holds;
-    $line{holds_on_order}       = $itemholds?$itemholds:$holds if $line{left_holds_on_order};
-    
-    
-    push @loop_orders, \%line if ($i >= $startfrom and $i < $startfrom + $resultsperpage);
-}
-$freight = $totalfreight unless $freight;
 
-my $count = $countpendings;
+    my $count = $countpendings;
 
-if ($count>$resultsperpage){
-    my $displaynext=0;
-    my $displayprev=$startfrom;
-    if(($count - ($startfrom+$resultsperpage)) > 0 ) {
-        $displaynext = 1;
-    }
+    if ($count>$resultsperpage){
+        my $displaynext=0;
+        my $displayprev=$startfrom;
+        if(($count - ($startfrom+$resultsperpage)) > 0 ) {
+            $displaynext = 1;
+        }
 
-    my @numbers = ();
-    for (my $i=1; $i<$count/$resultsperpage+1; $i++) {
-            my $highlight=0;
-            ($startfrom/$resultsperpage==($i-1)) && ($highlight=1);
-            push @numbers, { number => $i,
-                highlight => $highlight ,
-                startfrom => ($i-1)*$resultsperpage};
-    }
+        my @numbers = ();
+        for (my $i=1; $i<$count/$resultsperpage+1; $i++) {
+                my $highlight=0;
+                ($startfrom/$resultsperpage==($i-1)) && ($highlight=1);
+                push @numbers, { number => $i,
+                    highlight => $highlight ,
+                    startfrom => ($i-1)*$resultsperpage};
+        }
 
-    my $from = $startfrom*$resultsperpage+1;
-    my $to;
-    if($count < (($startfrom+1)*$resultsperpage)){
-        $to = $count;
-    } else {
-        $to = (($startfrom+1)*$resultsperpage);
+        my $from = $startfrom*$resultsperpage+1;
+        my $to;
+        if($count < (($startfrom+1)*$resultsperpage)){
+            $to = $count;
+        } else {
+            $to = (($startfrom+1)*$resultsperpage);
+        }
+        $template->param(numbers=>\@numbers,
+                         displaynext=>$displaynext,
+                         displayprev=>$displayprev,
+                         nextstartfrom=>(($startfrom+$resultsperpage<$count)?$startfrom+$resultsperpage:$count),
+                         prevstartfrom=>(($startfrom-$resultsperpage>0)?$startfrom-$resultsperpage:0)
+                        );
     }
-    $template->param(numbers=>\@numbers,
-                     displaynext=>$displaynext,
-                     displayprev=>$displayprev,
-                     nextstartfrom=>(($startfrom+$resultsperpage<$count)?$startfrom+$resultsperpage:$count),
-                     prevstartfrom=>(($startfrom-$resultsperpage>0)?$startfrom-$resultsperpage:0)
-                    );
+
+    $template->param(
+        countpending => $countpendings,
+        loop_orders  => \@loop_orders,
+        ordergrandtotal => sprintf($cfstr, $ordergrandtotal),
+        totalPunitprice => sprintf("%.2f", $totalPunitprice),
+        totalPquantity  => $totalPquantity,
+        totalPqtyrcvd   => $totalPqtyrcvd,
+        totalPecost     => sprintf("%.2f", $totalPecost),
+    );
 }
 
-#$totalfreight=$freight;
-$tototal = $tototal + $freight;
 
 $template->param(
-    invoice               => $invoice,
+    invoiceid             => $invoice->{invoiceid},
+    invoice               => $invoice->{invoicenumber},
+    invoiceclosedate      => $invoice->{closedate},
     datereceived          => $datereceived->output('iso'),
     invoicedatereceived   => $datereceived->output('iso'),
     formatteddatereceived => $datereceived->output(),
     name                  => $bookseller->{'name'},
-    supplierid            => $supplierid,
+    supplierid            => $bookseller->{id},
     gst                   => $gst,
-    freight               => $freight,
-    invoice               => $invoice,
     countreceived         => $countlines,
     loop_received         => \@loop_received,
-    countpending          => $countpendings,
-    loop_orders           => \@loop_orders,
     totalprice            => sprintf($cfstr, $totalprice),
-    totalfreight          => $totalfreight,
     totalquantity         => $totalquantity,
     tototal               => sprintf($cfstr, $tototal),
-    ordergrandtotal       => sprintf($cfstr, $ordergrandtotal),
     gst                   => $gst,
     grandtot              => sprintf($cfstr, $tototal + $gst),
-    totalPunitprice       => sprintf("%.2f", $totalPunitprice),
-    totalPquantity        => $totalPquantity,
-    totalPqtyrcvd         => $totalPqtyrcvd,
-    totalPecost           => sprintf("%.2f", $totalPecost),
     resultsperpage        => $resultsperpage,
 );
 output_html_with_http_headers $input, $cookie, $template->output;
- 
diff --git a/acqui/parcels.pl b/acqui/parcels.pl
index 915b1e8..b8aa69d 100755
--- a/acqui/parcels.pl
+++ b/acqui/parcels.pl
@@ -84,6 +84,7 @@ my $code           = $input->param('filter');
 my $datefrom       = $input->param('datefrom');
 my $dateto         = $input->param('dateto');
 my $resultsperpage = $input->param('resultsperpage');
+my $op             = $input->param('op');
 $resultsperpage ||= 20;
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
@@ -96,8 +97,34 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     }
 );
 
+if($op and $op eq 'new') {
+    my $invoicenumber = $input->param('invoice');
+    my $shipmentdate = $input->param('shipmentdate');
+    if($shipmentdate) {
+        $shipmentdate = C4::Dates->new($shipmentdate)->output('iso');
+    }
+    my $invoiceid = AddInvoice(
+        invoicenumber => $invoicenumber,
+        booksellerid => $supplierid,
+        shipmentdate => $shipmentdate,
+    );
+    if(defined $invoiceid) {
+        # Successful 'Add'
+        print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid");
+        exit 0;
+    } else {
+        $template->param(error_failed_to_create_invoice => 1);
+    }
+}
+
 my $bookseller = GetBookSellerFromId($supplierid);
-my @parcels = GetParcels( $supplierid, $order, $code, $datefrom, $dateto );
+my @parcels = GetInvoices(
+    supplierid => $supplierid,
+    invoicenumber => $code,
+    shipmentdatefrom => $datefrom,
+    shipmentdateto => $dateto,
+    order_by => $order
+);
 my $count_parcels = @parcels;
 
 # multi page display gestion
@@ -114,14 +141,15 @@ for my $i ( $startfrom .. $last_row) {
 
     push @{$loopres},
       { number           => $i + 1,
-        code             => $p->{booksellerinvoicenumber},
-        nullcode         => $p->{booksellerinvoicenumber} eq 'NULL',
-        emptycode        => $p->{booksellerinvoicenumber} eq q{},
-        raw_datereceived => $p->{datereceived},
-        datereceived     => format_date( $p->{datereceived} ),
-        bibcount         => $p->{biblio},
-        reccount         => $p->{itemsreceived},
-        itemcount        => $p->{itemsexpected},
+        invoiceid        => $p->{invoiceid},
+        code             => $p->{invoicenumber},
+        nullcode         => $p->{invoicenumber} eq 'NULL',
+        emptycode        => $p->{invoicenumber} eq q{},
+        raw_datereceived => $p->{shipmentdate},
+        datereceived     => format_date( $p->{shipmentdate} ),
+        bibcount         => $p->{receivedbiblios} || 0,
+        reccount         => $p->{receiveditems} || 0,
+        itemcount        => $p->{itemsexpected} || 0,
       };
 }
 if ($count_parcels) {
@@ -135,7 +163,7 @@ $template->param(
     resultsperpage           => $resultsperpage,
     name                     => $bookseller->{'name'},
     DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
-    datereceived_today       => C4::Dates->new()->output(),
+    shipmentdate_today       => C4::Dates->new()->output(),
     supplierid               => $supplierid,
     GST                      => C4::Context->preference('gist'),
 );
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc
index a0f094c..b67cec2 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-menu.inc
@@ -1,6 +1,7 @@
 <ul>
 	<li><a href="/cgi-bin/koha/acqui/lateorders.pl">Late orders</a></li>
 	[% IF ( suggestion ) %]<li><a href="/cgi-bin/koha/suggestion/suggestion.pl">Suggestions</a></li>[% ELSE %][% END %]
+    <li><a href="/cgi-bin/koha/acqui/invoices.pl">Invoices</a></li>
     [% IF ( CAN_user_acquisition_budget_manage ) %]
 	<li><a href="/cgi-bin/koha/admin/aqbudgetperiods.pl">Budgets &amp; Funds</a></li>
     [% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt
new file mode 100644
index 0000000..fe0dd36
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt
@@ -0,0 +1,182 @@
+[% USE KohaDates %]
+
+[% INCLUDE 'doc-head-open.inc' %]
+<title>Koha &rsaquo; Acquisitions &rsaquo; Invoice</title>
+[% INCLUDE 'doc-head-close.inc' %]
+[% INCLUDE 'calendar.inc' %]
+<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+    $(document).ready(function() {
+        $("#orderst").tablesorter({widgets : ['zebra']});
+        Calendar.setup({
+            inputField: "shipmentdate",
+            ifFormat: "[% DHTMLcalendar_dateformat %]",
+            button: "shipmentdateCalendar"
+        });
+        Calendar.setup({
+            inputField: "billingdate",
+            ifFormat: "[% DHTMLcalendar_dateformat %]",
+            button: "billingdateCalendar"
+        });
+    });
+//]]>
+</script>
+</head>
+
+<body>
+[% INCLUDE 'header.inc' %]
+[% INCLUDE 'acquisitions-search.inc' %]
+
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> &rsaquo; <a href="/cgi-bin/koha/acqui/invoices.pl">Invoices</a> &rsaquo; <a href="/cgi-bin/koha/acqui/invoice.pl?invoiceid=[% invoiceid %]">[% invoicenumber %]</a></div>
+
+<div id="doc3" class="yui-t2">
+
+<div id="bd">
+  <div id="yui-main">
+    <div class="yui-b">
+      [% IF ( modified ) %]
+        <div class="dialog">
+          <p>Invoice has been modified</p>
+        </div>
+      [% END %]
+      <h1>Invoice: [% invoicenumber %]</h1>
+
+      <p>Supplier: [% suppliername %]</p>
+      <form action="" method="post">
+        <label for="shipmentdate">Shipment date:</label>
+        [% IF (shipmentdate) %]
+            <input type="text" size="10" id="shipmentdate" name="shipmentdate" value="[% shipmentdate | $KohaDates %]" readonly="readonly" />
+        [% ELSE %]
+            <input type="text" size="10" id="shipmentdate" name="shipmentdate" readonly="readonly" />
+        [% END %]
+        <img id="shipmentdateCalendar" alt="Show Calendar" style="cursor:pointer" src="[% themelang %]/lib/calendar/cal.gif" />
+        <p></p>
+        <label for="billingdate">Billing date:</label>
+        [% IF (billingdate) %]
+            <input type="text" size="10" id="billingdate" name="billingdate" value="[% billingdate | $KohaDates %]" readonly="readonly" />
+        [% ELSE %]
+            <input type="text" size="10" id="billingdate" name="billingdate" value="[% billingdate | $KohaDates %]" readonly="readonly" />
+        [% END %]
+        <img id="billingdateCalendar" alt="Show Calendar" style="cursor:pointer" src="[% themelang %]/lib/calendar/cal.gif" />
+        <p></p>
+        <label for="shipmentcost">Shipment cost:</label>
+        <input type="text" size="10" id="shipmentcost" name="shipmentcost" value="[% shipmentcost %]" />
+        <label for="shipment_budget_id">Budget:</label>
+        <select id="shipment_budget_id" name="shipment_budget_id">
+            <option value="">No budget</option>
+          [% FOREACH budget IN budgets_loop %]
+            [% IF ( budget.selected ) %]
+              <option selected="selected" value="[% budget.budget_id %]">
+            [% ELSE %]
+              <option value="[% budget.budget_id %]">
+            [% END %]
+              [% budget.budget_name %]
+            </option>
+          [% END %]
+        </select>
+        <input type="hidden" name="op" value="mod" />
+        <input type="hidden" name="invoiceid" value="[% invoiceid %]" />
+        <fieldset class="action">
+            <input type="submit" value="Save">
+        </fieldset>
+      </form>
+      <p>Status:
+        [% IF ( invoiceclosedate ) %]
+          Closed on [% invoiceclosedate | $KohaDates %].
+          <a href="/cgi-bin/koha/acqui/invoice.pl?op=reopen&invoiceid=[% invoiceid %]">
+            Reopen
+          </a>
+        [% ELSE %]
+          Open.
+          <a href="/cgi-bin/koha/acqui/invoice.pl?op=close&invoiceid=[% invoiceid %]">
+            Close
+          </a>
+        [% END %]
+      </p>
+      <p>
+          <a href="/cgi-bin/koha/acqui/parcel.pl?invoiceid=[% invoiceid %]">Go to receipt page</a>
+      </p>
+      <h2>Invoice details</h2>
+      <table id="orderst">
+        <thead>
+          <tr>
+            <th>Summary</th>
+            <th>Publisher</th>
+            <th>Branch</th>
+            <th>RRP</th>
+            <th>Est.</th>
+            <th>Qty.</th>
+            <th>Total</th>
+            <th>Fund</th>
+          </tr>
+        </thead>
+        <tbody>
+          [% FOREACH order IN orders_loop %]
+            <tr>
+              <td><p>[% order.title %]
+                [% IF ( order.author ) %]
+                  <br /><em>by</em> [% order.author %]
+                [% END %]
+              </p></td>
+              <td>
+                [% IF ( order.publishercode ) %]
+                  <p>[% order.publishercode %]
+                    [% IF ( order.publicationyear ) %]
+                      - [% order.publicationyear %]
+                    [% END %]
+                  </p>
+                [% END %]
+              </td>
+              <td><p>[% order.branchcode %]</p></td>
+              <td>[% order.rrp %]</td>
+              <td>[% order.ecost %]</td>
+              <td class="number">[% order.quantity %]</td>
+              <td>[% order.total %]</td>
+              <td>[% order.budget_name %]</td>
+            </tr>
+          [% END %]
+        </tbody>
+        <tfoot>
+            <tr>
+                <th colspan="3">Total Tax Exc.</th>
+                <th>[% total_rrp_gste %]</th>
+                <th>&nbsp;</th>
+                <th>[% total_quantity %]</th>
+                <th>[% total_est_gste %]</th>
+                <th>&nbsp;</th>
+            </tr>
+            <tr>
+                <th colspan='3'>Tax ([% gist %]%)</th>
+                <th>[% gist_rrp %]</th>
+                <th>&nbsp;</th>
+                <th>&nbsp;</th>
+                <th>[% gist_est %]</th>
+                <th>&nbsp;</th>
+            </tr>
+            <tr>
+                <th colspan='3'>Total Tax Inc. ([% currency %])</th>
+                <th>[% total_rrp_gsti %]</th>
+                <th>&nbsp;</th>
+                <th>[% total_quantity %]</th>
+                <th>[% total_est_gsti %]</th>
+                <th>&nbsp;</th>
+            </tr>
+            <tr>
+                <th colspan="3">Total + Shipment cost ([% currency %])</th>
+                <th>&nbsp;</th>
+                <th>&nbsp;</th>
+                <th>[% total_quantity %]</th>
+                <th>[% total_gsti_shipment %]</th>
+                <th>&nbsp;</th>
+            </tr>
+        </tfoot>
+      </table>
+
+    </div>
+  </div>
+  <div class="yui-b">
+    [% INCLUDE 'acquisitions-menu.inc' %]
+  </div>
+</div>
+[% INCLUDE 'intranet-bottom.inc' %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt
new file mode 100644
index 0000000..c734745
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt
@@ -0,0 +1,223 @@
+[% USE KohaDates %]
+
+[% INCLUDE 'doc-head-open.inc' %]
+<title>Koha &rsaquo; Acquisitions &rsaquo; Invoices</title>
+[% INCLUDE 'doc-head-close.inc' %]
+<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
+[% INCLUDE 'calendar.inc' %]
+<script type="text/javascript">
+//<![CDATA[
+$(document).ready(function() {
+    Calendar.setup({
+        inputField: "billingdatefrom",
+        ifFormat: "[% DHTMLcalendar_dateformat %]",
+        button: "billingdatefromCalendar"
+    });
+    Calendar.setup({
+        inputField: "billingdateto",
+        ifFormat: "[% DHTMLcalendar_dateformat %]",
+        button: "billingdatetoCalendar"
+    });
+    $("#resultst").tablesorter({
+        widgets : ['zebra'],
+        headers: {
+            6: { sorter: false },
+        }
+    });
+});
+//]]>
+</script>
+</head>
+
+<body>
+[% INCLUDE 'header.inc' %]
+[% INCLUDE 'acquisitions-search.inc' %]
+
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> &rsaquo; Invoices</div>
+
+<div id="doc3" class="yui-t2">
+
+<div id="bd">
+  <div id="yui-main">
+    <div class="yui-b">
+      <h1>Invoices</h1>
+      [% IF ( do_search ) %]
+        [% IF ( results_loop ) %]
+          <table id="resultst">
+            <thead>
+              <tr>
+                <th>Invoice no.</th>
+                <th>Vendor</th>
+                <th>Billing date</th>
+                <th>Received biblios</th>
+                <th>Received items</th>
+                <th>Status</th>
+                <th>&nbsp;</th>
+              </tr>
+            </thead>
+            <tbody>
+              [% FOREACH result IN results_loop %]
+                <tr>
+                  <td>[% result.invoicenumber %]</td>
+                  <td>[% result.suppliername %]</td>
+                  <td>
+                    [% IF (result.billingdate) %]
+                      [% result.billingdate | $KohaDates %]
+                    [% END %]
+                  </td>
+                  <td>[% result.receivedbiblios %]</td>
+                  <td>[% result.receiveditems %]</td>
+                  <td>
+                    [% IF ( result.closedate ) %]
+                      Closed on [% result.closedate | $KohaDates %]
+                    [% ELSE %]
+                      Open
+                    [% END %]
+                  </td>
+                  <td>
+                    <a href="/cgi-bin/koha/acqui/invoice.pl?invoiceid=[% result.invoiceid %]">Details</a> /
+                    [% IF ( result.closedate ) %]
+                      <a href="invoice.pl?op=reopen&invoiceid=[% result.invoiceid %]">Reopen</a>
+                    [% ELSE %]
+                      <a href="invoice.pl?op=close&invoiceid=[% result.invoiceid %]">Close</a>
+                    [% END %]
+                  </td>
+                </tr>
+              [% END %]
+            </tbody>
+          </table>
+        [% ELSE %]
+          <p>Sorry, but there is no results for your search.</p>
+          <p>Search was:
+            <ul>
+              [% IF ( invoicenumber ) %]
+                <li>Invoice no.: [% invoicenumber %]</li>
+              [% END %]
+              [% IF ( supplier ) %]
+                <li>Vendor: [% suppliername %]</li>
+              [% END %]
+              [% IF ( billingdatefrom ) %]
+                <li>Billing date:
+                [% IF ( billingdateto ) %]
+                  From [% billingdatefrom %]
+                  To [% billingdateto %]
+                [% ELSE %]
+                  All since [% billingdatefrom %]
+                [% END %]
+                </li>
+              [% ELSE %]
+                [% IF ( billingdateto ) %]
+                  <li>Billing date:
+                    All until [% billingdateto %]
+                  </li>
+                [% END %]
+              [% END %]
+              [% IF ( isbneanissn ) %]
+                <li>ISBN/EAN/ISSN: [% isbneanissn %]</li>
+              [% END %]
+              [% IF ( title ) %]
+                <li>Title: [% title %]</li>
+              [% END %]
+              [% IF ( author ) %]
+                <li>Author: [% author %]</li>
+              [% END %]
+              [% IF ( publisher ) %]
+                <li>Publisher: [% publisher %]</li>
+              [% END %]
+              [% IF ( publicationyear ) %]
+                <li>Publication year: [% publicationyear %]</li>
+              [% END %]
+              [% IF ( branch ) %]
+                <li>Branch: [% branchname %]</li>
+              [% END %]
+            </ul>
+          </p>
+        [% END %]<!-- results_loop -->
+      [% ELSE %]
+        <p>Please fill in the form to the left to make a search.</p>
+      [% END %]<!-- do_search -->
+    </div>
+  </div>
+  <div class="yui-b">
+    <form action="" method="get">
+      <fieldset class="brief">
+        <h3>Search filters</h3>
+        <ol>
+          <li>
+            <label for="invoicenumber">Invoice no:</label>
+            <input type="text" id="invoicenumber" name="invoicenumber" value="[% invoicenumber %]" />
+          </li>
+          <li>
+            <label for="supplier">Supplier:</label>
+            <select id="supplier" name="supplier">
+              <option value="">All</option>
+              [% FOREACH supplier IN suppliers_loop %]
+                [% IF ( supplier.selected ) %]
+                  <option selected="selected" value="[% supplier.supplierid %]">[% supplier.suppliername %]</option>
+                [% ELSE %]
+                  <option value="[% supplier.supplierid %]">[% supplier.suppliername %]</option>
+                [% END %]
+              [% END %]
+            </select>
+          </li>
+          <li>
+            <fieldset class="brief">
+              <legend>Billing date</legend>
+              <ol>
+                <li>
+                  <label for="billingdatefrom">From:</label>
+                  <input type="text" id="billingdatefrom" name="billingdatefrom" size="10" value="[% billingdatefrom %]" />
+                  <img id="billingdatefromCalendar" alt="Show Calendar" style="cursor:pointer;" src="[% themelang %]/lib/calendar/cal.gif" />
+                </li>
+                <li>
+                  <label for="billingdateto">To:</label>
+                  <input type="text" id="billingdateto" name="billingdateto" size="10" value="[% billingdateto %]" />
+                  <img id="billingdatetoCalendar" alt="Show Calendar" style="cursor:pointer;" src="[% themelang %]/lib/calendar/cal.gif" />
+                </li>
+              </ol>
+            </fieldset>
+          </li>
+          <li>
+            <label for="isbneanissn">ISBN / EAN / ISSN:</label>
+            <input type="text" id="isbneanissn" name="isbneanissn" value="[% isbneanissn %]" />
+          </li>
+          <li>
+            <label for="title">Title:</label>
+            <input type="text" id="title" name="title" value="[% title %]" />
+          </li>
+          <li>
+            <label for="author">Author:</label>
+            <input type="text" id="author" name="author" value="[% author %]" />
+          </li>
+          <li>
+            <label for="publisher">Publisher:</label>
+            <input type="text" id="publisher" name="publisher" value="[% publisher %]" />
+          </li>
+          <li>
+            <label for="publicationyear">Publication year:</label>
+            <input type="text" id="publicationyear" name="publicationyear" value="[% publicationyear %]" />
+          </li>
+          <li>
+            <label for="branch">Branch:</label>
+            <select id="branch" name="branch">
+              <option value="">All</option>
+              [% FOREACH branch IN branches_loop %]
+                [% IF ( branch.selected ) %]
+                  <option selected="selected" value="[% branch.branchcode %]">[% branch.branchname %]</option>
+                [% ELSE %]
+                  <option value="[% branch.branchcode %]">[% branch.branchname %]</option>
+                [% END %]
+              [% END %]
+            </select>
+          </li>
+        </ol>
+        <fieldset class="action">
+          <input type="submit" value="Search" />
+        </fieldset>
+      </fieldset>
+      <input type="hidden" name="op" id="op" value="do_search" />
+    </form>
+    [% INCLUDE 'acquisitions-menu.inc' %]
+  </div>
+</div>
+[% INCLUDE 'intranet-bottom.inc' %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
index ea422c8..c9b2693 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
@@ -78,11 +78,11 @@
     </fieldset>
     [% END %] <!-- items -->
     <input type="hidden" name="biblionumber" value="[% biblionumber %]" />
+    <input type="hidden" name="invoiceid" value="[% invoiceid %]" />
     <input type="hidden" name="ordernumber" value="[% ordernumber %]" />
     <input type="hidden" name="biblioitemnumber" value="[% biblioitemnumber %]" />
     <input type="hidden" name="supplierid" value="[% supplierid %]" />
     <input type="hidden" name="datereceived" value="[% datereceived_iso %]" />
-    <input type="hidden" name="freight" value="[% freight %]" />
     <input type="hidden" name="gst" value="[% gst %]" />
 	</div>
 	<div class="yui-u">
@@ -130,12 +130,11 @@
             <input type="text" size="20" name="cost" id="cost" value="[% ecost %]" />
         [% END %]</li></ol>
         <label for="note">Notes: </label><textarea name="note" width="40" rows="8" >[% notes %]</textarea>
-        <input type="hidden" name="invoice" value="[% invoice %]" />
     </fieldset>
 
 </div>
 </div><div class="yui-g"><fieldset class="action">
-        <input type="button"  value="Save" onclick="javascript:if(check_additem()) { this.form.submit(); } else { alert( _('Duplicate barcodes detected.  Please correct the errors and resubmit.') ); return false };" /> <a class="cancel" href="/cgi-bin/koha/acqui/parcel.pl?supplierid=[% supplierid %]&amp;invoice=[% invoice %]&amp;gst=[% gst %]&amp;freight=[% freight %]">Cancel</a>
+        <input type="button"  value="Save" onclick="javascript:if(check_additem()) { this.form.submit(); } else { alert( _('Duplicate barcodes detected.  Please correct the errors and resubmit.') ); return false };" /> <a class="cancel" href="/cgi-bin/koha/acqui/parcel.pl?invoiceid=[% invoiceid %]">Cancel</a>
 </fieldset></div>    </form>
 [% ELSE %]
 <div id="acqui_acquire_orderlist">
@@ -152,7 +151,7 @@
         <tr>
             <td>[% loo.basketno %]</td>
             <td>[% loo.isbn %]</td>
-         <td><a href="orderreceive.pl?datereceived=[% loo.datereceived %]&amp;receive=[% loo.ordernumber %]&amp;biblio=[% loo.biblionumber %]&amp;invoice=[% loo.invoice %]&amp;freight=[% loo.freight %]&amp;gst=[% loo.gst %]&amp;id=[% loo.id %]">[% loo.title |html %]</a></td>
+         <td><a href="orderreceive.pl?ordernumber=[% loo.ordernumber %]&amp;invoiceid=[% invoiceid %]">[% loo.title |html %]</a></td>
             <td>[% loo.author %]</td>
             <td>[% loo.quantity %]</td>
             <td>[% loo.quantityreceived %]</td>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt
index eb5492e..893c657 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt
@@ -157,11 +157,17 @@
 [% INCLUDE 'header.inc' %]
 [% INCLUDE 'acquisitions-search.inc' %]
 
-<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> &rsaquo;  [% IF ( datereceived ) %]
-            Receipt Summary for <i>[% name %]</i> [% IF ( invoice ) %]<i>[ [% invoice %] ]</i>[% END %] on <i>[% formatteddatereceived %]</i>
-        [% ELSE %]
-            Receive orders from [% name %]
-        [% END %]</div>
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a> &rsaquo;
+    [% IF ( datereceived ) %]
+        Receipt Summary for <i>[% name %]</i>
+        [% IF ( invoice ) %]
+            <i>[ [% invoice %] ]</i>
+        [% END %]
+        on <i>[% formatteddatereceived %]</i>
+    [% ELSE %]
+        Receive orders from [% name %]
+    [% END %]
+</div>
 
 <div id="doc3" class="yui-t2">
 
@@ -199,102 +205,110 @@
 
 <div id="acqui_receive_summary">
 <p><strong>Invoice number:</strong> [% invoice %] <strong>Received by:</strong> [% loggedinusername %] <strong>On:</strong> [% formatteddatereceived %]</p>
-	<!-- TODO: Add date picker, change rcv date. -->
+<p><a href="/cgi-bin/koha/acqui/invoice.pl?invoiceid=[% invoiceid %]">Go to invoice details</a></p>
 </div>
-<div id="acqui_receive_search">
-    <h3>Pending Orders</h3>
-
- [% IF ( loop_orders ) %]<table id="pendingt">
-    <thead>
-        <tr>
-            <th>Basket</th>
-            <th>Order Line</th>
-            <th>Summary</th>
-    	    <th>View Record</th>
-            <th>Quantity</th>
-            <th>Unit cost</th>
-            <th>Order cost</th>
-            <th>&nbsp;</th>
-            <th>&nbsp;</th>
-        </tr>
-    </thead>
-		<tfoot>
-            <tr><td colspan="4" class="total">TOTAL</td>
-                <td> [% totalPquantity %] </td>
-				<td>&nbsp;</td>
-                <td>[% ordergrandtotal %]</td>
-				<td>&nbsp;</td>
-				<td>&nbsp;</td>
-            </tr>
-		</tfoot>
-    <tbody class="filterclass">
-        [% FOREACH loop_order IN loop_orders %]
-	[% UNLESS ( loop.odd ) %]
-            <tr class="highlight">
-        [% ELSE %]
+[% UNLESS (invoiceclosedate) %]
+    <div id="acqui_receive_search">
+        <h3>Pending Orders</h3>
+
+     [% IF ( loop_orders ) %]<table id="pendingt">
+        <thead>
             <tr>
-        [% END %]
-                <td class="basketfilterclass"><a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% loop_order.basketno %]">[% loop_order.basketno %]</a></td>
-                <td class="orderfilterclass"><a href="neworderempty.pl?ordernumber=[% loop_order.ordernumber %]&amp;booksellerid=[% loop_order.supplierid %]">[% loop_order.ordernumber %]</a></td>
-                <td class="summaryfilterclass">
-                  <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% loop_order.biblionumber %]">[% loop_order.title |html %]</a>
-                [% IF ( loop_order.author ) %] by [% loop_order.author %][% END %]
-                [% IF ( loop_order.isbn ) %] &ndash; [% loop_order.isbn %][% END %]
-                [% IF ( loop_order.publishercode ) %]<br />Publisher :[% loop_order.publishercode %][% END %]
-                </td>
-                <td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&amp;id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">Card</a></td>
-                <td>[% loop_order.quantity %]</td>
-                <td>[% loop_order.ecost %]</td>
-                <td>[% loop_order.ordertotal %]</td>
-				<td>
-				    <a href="orderreceive.pl?ordernumber=[% loop_order.ordernumber %]&amp;datereceived=[% loop_order.invoicedatereceived %]&amp;invoice=[% loop_order.invoice %]&amp;gst=[% loop_order.gst %]&amp;freight=[% loop_order.freight %]&amp;supplierid=[% loop_order.supplierid %]">Receive</a>
-				    
-				</td>
-				<td>
-				    [% IF ( loop_order.left_holds_on_order ) %]
-                    <span class="button" title="Can't delete order, ([% loop_order.holds_on_order %]) holds are linked with this order cancel holds first">Can't delete order</span><br>
-                    [% ELSE %]
-                    <a href="javascript:confirm_delete_item([% loop_order.ordernumber %],[% loop_order.basketno %],[% loop_order.biblionumber %])" class="button">Delete order</a><br>
-                    [% END %]
-                    [% IF ( loop_order.can_del_bib ) %]
-                    <a href="javascript:confirm_delete_biblio([% loop_order.ordernumber %],[% loop_order.basketno %],[% loop_order.biblionumber %])" class="button">Delete order and catalog record</a><br>
-                    [% ELSE %]
-                    <span class="button" title="Can't delete catalog record, see constraints below">Can't delete order and catalog record</span><br>
-                    [% END %]
-                    [% IF ( loop_order.left_item ) %]
-                    <b title="Can't delete catalog record, because of [% loop_order.items %] existing item(s)" >[% loop_order.items %] item(s) left</b><br>
-                    [% END %]
-                    [% IF ( loop_order.left_biblio ) %]
-                    <b title="Can't delete catalog record, delete other orders linked to it first">[% loop_order.biblios %] order(s) left</b><br>
-                    [% END %]
-                    [% IF ( loop_order.left_subscription ) %]
-                    <b title="Can't delete catalog record, delete subscriptions first">[% loop_order.subscriptions %] subscription(s) left</b><br>
-                    [% END %]
-                    [% IF ( loop_order.left_holds ) %]
-                    <b title="Can't delete catalog record or order, cancel holds first">[% loop_order.holds %] hold(s) left</b>
-                    [% END %]
-				</td>
+                <th>Basket</th>
+                <th>Order Line</th>
+                <th>Summary</th>
+                <th>View Record</th>
+                <th>Quantity</th>
+                <th>Unit cost</th>
+                <th>Order cost</th>
+                <th>&nbsp;</th>
+                <th>&nbsp;</th>
             </tr>
+        </thead>
+            <tfoot>
+                <tr><td colspan="4" class="total">TOTAL</td>
+                    <td> [% totalPquantity %] </td>
+                    <td>&nbsp;</td>
+                    <td>[% ordergrandtotal %]</td>
+                    <td>&nbsp;</td>
+                    <td>&nbsp;</td>
+                </tr>
+            </tfoot>
+        <tbody class="filterclass">
+            [% FOREACH loop_order IN loop_orders %]
+        [% UNLESS ( loop.odd ) %]
+                <tr class="highlight">
+            [% ELSE %]
+                <tr>
+            [% END %]
+                    <td class="basketfilterclass"><a href="/cgi-bin/koha/acqui/basket.pl?basketno=[% loop_order.basketno %]">[% loop_order.basketno %]</a></td>
+                    <td class="orderfilterclass"><a href="neworderempty.pl?ordernumber=[% loop_order.ordernumber %]&amp;booksellerid=[% loop_order.supplierid %]">[% loop_order.ordernumber %]</a></td>
+                    <td class="summaryfilterclass">
+                      <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% loop_order.biblionumber %]">[% loop_order.title |html %]</a>
+                    [% IF ( loop_order.author ) %] by [% loop_order.author %][% END %]
+                    [% IF ( loop_order.isbn ) %] &ndash; [% loop_order.isbn %][% END %]
+                    [% IF ( loop_order.publishercode ) %]<br />Publisher :[% loop_order.publishercode %][% END %]
+                    </td>
+                    <td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&amp;id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">Card</a></td>
+                    <td>[% loop_order.quantity %]</td>
+                    <td>[% loop_order.ecost %]</td>
+                    <td>[% loop_order.ordertotal %]</td>
+                    <td>
+                        <a href="orderreceive.pl?ordernumber=[% loop_order.ordernumber %]&amp;invoiceid=[% invoiceid %]">Receive</a>
+                        
+                    </td>
+                    <td>
+                        [% IF ( loop_order.left_holds_on_order ) %]
+                        <span class="button" title="Can't delete order, ([% loop_order.holds_on_order %]) holds are linked with this order cancel holds first">Can't delete order</span><br>
+                        [% ELSE %]
+                        <a href="javascript:confirm_delete_item([% loop_order.ordernumber %],[% loop_order.biblionumber %])" class="button">Delete order</a><br>
+                        [% END %]
+                        [% IF ( loop_order.can_del_bib ) %]
+                        <a href="javascript:confirm_delete_biblio([% loop_order.ordernumber %],[% loop_order.biblionumber %])" class="button">Delete order and catalog record</a><br>
+                        [% ELSE %]
+                        <span class="button" title="Can't delete catalog record, see constraints below">Can't delete order and catalog record</span><br>
+                        [% END %]
+                        [% IF ( loop_order.left_item ) %]
+                        <b title="Can't delete catalog record, because of [% loop_order.items %] existing item(s)" >[% loop_order.items %] item(s) left</b><br>
+                        [% END %]
+                        [% IF ( loop_order.left_biblio ) %]
+                        <b title="Can't delete catalog record, delete other orders linked to it first">[% loop_order.biblios %] order(s) left</b><br>
+                        [% END %]
+                        [% IF ( loop_order.left_subscription ) %]
+                        <b title="Can't delete catalog record, delete subscriptions first">[% loop_order.subscriptions %] subscription(s) left</b><br>
+                        [% END %]
+                        [% IF ( loop_order.left_holds ) %]
+                        <b title="Can't delete catalog record or order, cancel holds first">[% loop_order.holds %] hold(s) left</b>
+                        [% END %]
+                    </td>
+                </tr>
+            [% END %]
+        </tbody>
+         </table>[% ELSE %]There are no pending orders.[% END %]
+       <div id="resultnumber">
+        <!-- Row of numbers corresponding to search result pages -->
+        [% IF ( displayprev ) %]
+            <a href="parcel.pl?type=intra&amp;supplierid=[% supplierid %]&amp;startfrom=[% prevstartfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">&lt;&lt; Previous</a>
         [% END %]
-    </tbody>
-     </table>[% ELSE %]There are no pending orders.[% END %]
-   <div id="resultnumber">
-	<!-- Row of numbers corresponding to search result pages -->
-	[% IF ( displayprev ) %]
-		<a href="parcel.pl?type=intra&amp;supplierid=[% supplierid %]&amp;startfrom=[% prevstartfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">&lt;&lt; Previous</a>
-	[% END %]
-	[% FOREACH number IN numbers %]
-		[% IF ( number.highlight ) %]
-		<span class="current">[% number.number %]</span>
-		[% ELSE %]
-		<a href="parcel.pl?type=intra&amp;supplierid=[% supplierid %]&amp;startfrom=[% number.startfrom %][% IF ( number.datereceived ) %]&amp;datereceived=[% number.datereceived %][% END %][% IF ( number.invoice ) %]&amp;invoice=[% number.invoice %][% END %][% IF ( number.resultsperpage ) %]&amp;resultsperpage=[% number.resultsperpage %][% END %]#resultnumber">[% number.number %]</a>
-		[% END %]
-	[% END %]
-	[% IF ( displaynext ) %]
-		<a href="parcel.pl?type=intra&amp;supplierid=[% supplierid %]&amp;startfrom=[% nextstartfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">Next &gt;&gt;</a>
-	[% END %]
-	</div>
-</div>
+        [% FOREACH number IN numbers %]
+            [% IF ( number.highlight ) %]
+            <span class="current">[% number.number %]</span>
+            [% ELSE %]
+            <a href="parcel.pl?type=intra&amp;supplierid=[% supplierid %]&amp;startfrom=[% number.startfrom %][% IF ( number.datereceived ) %]&amp;datereceived=[% number.datereceived %][% END %][% IF ( number.invoice ) %]&amp;invoice=[% number.invoice %][% END %][% IF ( number.resultsperpage ) %]&amp;resultsperpage=[% number.resultsperpage %][% END %]#resultnumber">[% number.number %]</a>
+            [% END %]
+        [% END %]
+        [% IF ( displaynext ) %]
+            <a href="parcel.pl?type=intra&amp;supplierid=[% supplierid %]&amp;startfrom=[% nextstartfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">Next &gt;&gt;</a>
+        [% END %]
+        </div>
+    </div>
+[% ELSE %]
+    <p>
+        Invoice is close, so you can't receive orders.
+        <a href="/cgi-bin/koha/acqui/invoice.pl?op=reopen&invoiceid=[% invoiceid %]&referer=/cgi-bin/koha/acqui/parcel.pl%3Finvoiceid=[% invoiceid %]">Reopen it</a>.
+    </p>
+[% END %]
+
 <div id="acqui_receive_receivelist">
     <h3>Already Received</h3>
 
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcels.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcels.tt
index a7d704d..d6b12a4 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcels.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcels.tt
@@ -14,7 +14,12 @@
    <div id="bd">
 	<div id="yui-main">
 	<div class="yui-b">
-	
+
+[% IF ( error_failed_to_create_invoice ) %]
+    <div id="error" class="dialog error">
+        <p>An error has occured. Invoice cannot be created.</p>
+    </div>
+[% END %]
 <h1>Receive shipment from vendor <a href="/cgi-bin/koha/acqui/supplier.pl?supplierid=[% supplierid %]">[% name %]</a></h1>
 
 [% IF ( count ) %]
@@ -42,11 +47,16 @@
             [% searchresult.number %]
         </td>
         <td>
-            <a href="/cgi-bin/koha/acqui/parcel.pl?type=intra&amp;supplierid=[% supplierid |url %]&amp;datereceived=[% searchresult.raw_datereceived |url %][% IF ( searchresult.code ) %]&amp;invoice=[% searchresult.code |url %][% END %]">
-                [% searchresult.datereceived %]</a>
+            [% searchresult.datereceived %]
         </td>
         <td>
-            [% IF ( searchresult.code ) %][% searchresult.code %][% ELSE %]<acronym title="not available">n/a</acronym>[% END %]
+            [% IF ( searchresult.code ) %]
+                <a href="/cgi-bin/koha/acqui/parcel.pl?invoiceid=[% searchresult.invoiceid %]">
+                    [% searchresult.code %]
+            </a>
+            [% ELSE %]
+                <acronym title="not available">n/a</acronym>
+            [% END %]
         </td>
         <td>
             [% searchresult.reccount %] 
@@ -81,7 +91,7 @@
 [% END %]
 
     <div id="parcels_new_parcel">
-        <form method="get" action="parcel.pl">
+        <form method="get" action="parcels.pl">
     <fieldset class="rows">
     <legend>Receive a new shipment</legend>
        <ol> <li>
@@ -90,26 +100,16 @@
             <input type="hidden" name="op" value="new" />
 			<input type="text" size="20" id="invoice" name="invoice" />
         </li>
-		[% IF ( gst ) %]
-        <li>
-            <label for="gst">GST:</label>
-            <input type="text" size="20" id="gst" name="gst" />
-        </li>
-		[% END %]
-      <!--  // Removing freight input until shipping can be proplerly handled .
-	  <li>
-            <label for="freight">Shipping:</label>
-            <input type="text" size="20" id="freight" name="freight" />
-        </li> -->
-         <li><label for="datereceived">Shipment date: </label>
-            <input type="text" id="datereceived" name="datereceived"  maxlength="10" size="10"  value="[% datereceived_today %]" />
-            <img src="[% themelang %]/lib/calendar/cal.gif" id="datereceived_button" alt="Show Calendar" />
+         <li><label for="shipmentdate">Shipment date: </label>
+            <input type="text" id="shipmentdate" name="shipmentdate" maxlength="10" size="10" value="[% shipmentdate_today %]" />
+            <img src="[% themelang %]/lib/calendar/cal.gif" id="shipmentdate_button" alt="Show Calendar" />
       <script language="JavaScript" type="text/javascript">
         Calendar.setup(
           {
-            inputField : "datereceived",
+            inputField : "shipmentdate",
             ifFormat : "[% DHTMLcalendar_dateformat %]",
-            button : "datereceived_button"          }
+            button : "shipmentdate_button"
+          }
         );
       </script>
 				<div class="hint">[% INCLUDE 'date-format.inc' %]</div>	</li>
@@ -131,9 +131,9 @@
                 <label for="dateto">To:</label><input type="text" size="9" id="dateto" name="dateto" value="[% dateto %]" /></li>
             <li><label for="orderby">Sort by :</label><select name="orderby" id="orderby">
                 <option value="aqorders.booksellerinvoicenumber">Invoice number</option>
-                <option value="datereceived"> Date Received</option>
-                <option value="datereceived desc"> Date Received reverse</option>
-                <option value="aqorders.booksellerinvoicenumber desc"> Invoice number reverse</option>
+                <option value="shipmentdate">Shipment date</option>
+                <option value="datereceived desc">Shipment date reverse</option>
+                <option value="aqorders.booksellerinvoicenumber desc">Invoice number reverse</option>
                 </select><br />
                 <label for="resultsperpage">Results per page :</label><select name="resultsperpage" id="resultsperpage">
                 <option value="20">20</option>
-- 
1.7.9



More information about the Koha-patches mailing list