Bug 12674: GetMarcISSN should not return empty ISSN
[srvgit] / C4 / Acquisition.pm
index c565db6..5fc45c7 100644 (file)
@@ -18,8 +18,7 @@ package C4::Acquisition;
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 
-use strict;
-use warnings;
+use Modern::Perl;
 use Carp;
 use C4::Context;
 use C4::Debug;
@@ -27,8 +26,8 @@ use C4::Dates qw(format_date format_date_in_iso);
 use MARC::Record;
 use C4::Suggestions;
 use C4::Biblio;
+use C4::Contract;
 use C4::Debug;
-use C4::SQLHelper qw(InsertInTable UpdateInTable);
 use C4::Bookseller qw(GetBookSellerFromId);
 use C4::Templates qw(gettemplate);
 
@@ -65,7 +64,6 @@ BEGIN {
         &NewOrderItem &ModItemOrder
 
         &GetParcels &GetParcel
-        &GetContracts &GetContract
 
         &GetInvoices
         &GetInvoice
@@ -293,9 +291,11 @@ sub GetBasketAsCSV {
     my ($basketno, $cgi) = @_;
     my $basket = GetBasket($basketno);
     my @orders = GetOrders($basketno);
-    my $contract = GetContract($basket->{'contractnumber'});
+    my $contract = GetContract({
+        contractnumber => $basket->{'contractnumber'}
+    });
 
-    my $template = C4::Templates::gettemplate("acqui/csv/basket.tmpl", "intranet", $cgi);
+    my $template = C4::Templates::gettemplate("acqui/csv/basket.tt", "intranet", $cgi);
 
     my @rows;
     foreach my $order (@orders) {
@@ -310,7 +310,7 @@ sub GetBasketAsCSV {
             publicationyear => $bd->{'publicationyear'},
             publishercode => $bd->{'publishercode'},
             collectiontitle => $bd->{'collectiontitle'},
-            notes => $order->{'order_internalnote'},
+            notes => $order->{'order_vendornote'},
             quantity => $order->{'quantity'},
             rrp => $order->{'rrp'},
             deliveryplace => C4::Branch::GetBranchName( $basket->{'deliveryplace'} ),
@@ -356,12 +356,14 @@ sub GetBasketGroupAsCSV {
     my ($basketgroupid, $cgi) = @_;
     my $baskets = GetBasketsByBasketgroup($basketgroupid);
 
-    my $template = C4::Templates::gettemplate('acqui/csv/basketgroup.tmpl', 'intranet', $cgi);
+    my $template = C4::Templates::gettemplate('acqui/csv/basketgroup.tt', 'intranet', $cgi);
 
     my @rows;
     for my $basket (@$baskets) {
-        my @orders     = GetOrders( $$basket{basketno} );
-        my $contract   = GetContract( $$basket{contractnumber} );
+        my @orders     = GetOrders( $basket->{basketno} );
+        my $contract   = GetContract({
+            contractnumber => $basket->{contractnumber}
+        });
         my $bookseller = GetBookSellerFromId( $$basket{booksellerid} );
         my $basketgroup = GetBasketgroup( $$basket{basketgroupid} );
 
@@ -381,7 +383,7 @@ sub GetBasketGroupAsCSV {
                 rrp => $order->{rrp},
                 discount => $bookseller->{discount},
                 ecost => $order->{ecost},
-                notes => $order->{order_internalnote},
+                notes => $order->{order_vendornote},
                 entrydate => $order->{entrydate},
                 booksellername => $bookseller->{name},
                 bookselleraddress => $bookseller->{address1},
@@ -632,9 +634,12 @@ sub GetBasketsInfosByBookseller {
     return unless $supplierid;
 
     my $dbh = C4::Context->dbh;
-    my $query = qq{
+    my $query = q{
         SELECT aqbasket.*,
           SUM(aqorders.quantity) AS total_items,
+          SUM(
+            IF ( aqorders.orderstatus = 'cancelled', aqorders.quantity, 0 )
+          ) AS total_items_cancelled,
           COUNT(DISTINCT aqorders.biblionumber) AS total_biblios,
           SUM(
             IF(aqorders.datereceived IS NULL
@@ -645,14 +650,30 @@ sub GetBasketsInfosByBookseller {
         FROM aqbasket
           LEFT JOIN aqorders ON aqorders.basketno = aqbasket.basketno
         WHERE booksellerid = ?};
-    if(!$allbaskets) {
+
+    unless ( $allbaskets ) {
         $query.=" AND (closedate IS NULL OR (aqorders.quantity > aqorders.quantityreceived AND datecancellationprinted IS NULL))";
     }
     $query.=" GROUP BY aqbasket.basketno";
 
     my $sth = $dbh->prepare($query);
     $sth->execute($supplierid);
-    return $sth->fetchall_arrayref({});
+    my $baskets = $sth->fetchall_arrayref({});
+
+    # Retrieve the number of biblios cancelled
+    my $cancelled_biblios = $dbh->selectall_hashref( q|
+        SELECT COUNT(DISTINCT(biblionumber)) AS total_biblios_cancelled, aqbasket.basketno
+        FROM aqbasket
+        LEFT JOIN aqorders ON aqorders.basketno = aqbasket.basketno
+        WHERE booksellerid = ?
+        AND aqorders.orderstatus = 'cancelled'
+        GROUP BY aqbasket.basketno
+    |, 'basketno', {}, $supplierid );
+    map {
+        $_->{total_biblios_cancelled} = $cancelled_biblios->{$_->{basketno}}{total_biblios_cancelled} || 0
+    } @$baskets;
+
+    return $baskets;
 }
 
 =head3 GetBasketUsers
@@ -1033,7 +1054,6 @@ sub GetOrders {
         SELECT biblio.*,biblioitems.*,
                 aqorders.*,
                 aqbudgets.*,
-                biblio.title,
                 aqorders_transfers.ordernumber_from AS transferred_from,
                 aqorders_transfers.timestamp AS transferred_from_timestamp
         FROM    aqorders
@@ -1252,18 +1272,19 @@ sub NewOrder {
         croak "Mandatory parameter $key missing" unless $orderinfo->{$key};
     }
 
-    if ( defined $orderinfo->{subscription} && $orderinfo->{'subscription'} eq 'yes' ) {
-        $orderinfo->{'subscription'} = 1;
-    } else {
-        $orderinfo->{'subscription'} = 0;
-    }
     $orderinfo->{'entrydate'} ||= C4::Dates->new()->output("iso");
     if (!$orderinfo->{quantityreceived}) {
         $orderinfo->{quantityreceived} = 0;
     }
 
-    my $ordernumber=InsertInTable("aqorders",$orderinfo);
-    if (not $orderinfo->{parent_ordernumber}) {
+    # get only the columns of Aqorder
+    my $schema = Koha::Database->new()->schema;
+    my $columns = ' '.join(' ', $schema->source('Aqorder')->columns).' ';
+    my $new_order = { map { $columns =~ / $_ / ? ($_ => $orderinfo->{$_}) : () } keys(%$orderinfo) };
+
+    my $rs = $schema->resultset('Aqorder');
+    my $ordernumber = $rs->create($new_order)->id;
+    if (not $new_order->{parent_ordernumber}) {
         my $sth = $dbh->prepare("
             UPDATE aqorders
             SET parent_ordernumber = ordernumber
@@ -1271,7 +1292,7 @@ sub NewOrder {
         ");
         $sth->execute($ordernumber);
     }
-    return ( $orderinfo->{'basketno'}, $ordernumber );
+    return ( $new_order->{'basketno'}, $ordernumber );
 }
 
 
@@ -1596,6 +1617,7 @@ sub CancelReceipt {
         };
         $sth = $dbh->prepare($query);
         $sth->execute(0, undef, undef, $ordernumber);
+        _cancel_items_receipt( $ordernumber );
     } else {
         # The order line has a parent, increase parent quantity and delete
         # the order line.
@@ -1632,25 +1654,7 @@ sub CancelReceipt {
                 " receipt";
             return;
         }
-        if(C4::Context->preference('AcqCreateItem') eq 'receiving') {
-            # Remove items that were created at receipt
-            $query = qq{
-                DELETE FROM items, aqorders_items
-                USING items, aqorders_items
-                WHERE items.itemnumber = ? AND aqorders_items.itemnumber = ?
-            };
-            $sth = $dbh->prepare($query);
-            my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
-            foreach my $itemnumber (@itemnumbers) {
-                $sth->execute($itemnumber, $itemnumber);
-            }
-        } else {
-            # Update items
-            my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
-            foreach my $itemnumber (@itemnumbers) {
-                ModItemOrder($itemnumber, $parent_ordernumber);
-            }
-        }
+        _cancel_items_receipt( $ordernumber, $parent_ordernumber );
         # Delete order line
         $query = qq{
             DELETE FROM aqorders
@@ -1664,6 +1668,31 @@ sub CancelReceipt {
     return $parent_ordernumber;
 }
 
+sub _cancel_items_receipt {
+    my ( $ordernumber, $parent_ordernumber ) = @_;
+    $parent_ordernumber ||= $ordernumber;
+
+    my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
+    if(C4::Context->preference('AcqCreateItem') eq 'receiving') {
+        # Remove items that were created at receipt
+        my $query = qq{
+            DELETE FROM items, aqorders_items
+            USING items, aqorders_items
+            WHERE items.itemnumber = ? AND aqorders_items.itemnumber = ?
+        };
+        my $dbh = C4::Context->dbh;
+        my $sth = $dbh->prepare($query);
+        foreach my $itemnumber (@itemnumbers) {
+            $sth->execute($itemnumber, $itemnumber);
+        }
+    } else {
+        # Update items
+        foreach my $itemnumber (@itemnumbers) {
+            ModItemOrder($itemnumber, $parent_ordernumber);
+        }
+    }
+}
+
 #------------------------------------------------------------#
 
 =head3 SearchOrders
@@ -1704,6 +1733,8 @@ sub SearchOrders {
     my $owner = $params->{owner};
     my $pending = $params->{pending};
     my $ordered = $params->{ordered};
+    my $biblionumber = $params->{biblionumber};
+    my $budget_id = $params->{budget_id};
 
     my $dbh = C4::Context->dbh;
     my @args = ();
@@ -1728,6 +1759,14 @@ sub SearchOrders {
             LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber
             LEFT JOIN biblio ON aqorders.biblionumber=biblio.biblionumber
             LEFT JOIN biblioitems ON biblioitems.biblionumber=biblio.biblionumber
+    };
+
+    # If we search on ordernumber, we retrieve the transfered order if a transfer has been done.
+    $query .= q{
+            LEFT JOIN aqorders_transfers ON aqorders_transfers.ordernumber_to = aqorders.ordernumber
+    } if $ordernumber;
+
+    $query .= q{
         WHERE (datecancellationprinted is NULL)
     };
 
@@ -1752,8 +1791,12 @@ sub SearchOrders {
     }
 
     if ( $ordernumber ) {
-        $query .= ' AND (aqorders.ordernumber=?)';
-        push @args, $ordernumber;
+        $query .= ' AND ( aqorders.ordernumber = ? OR aqorders_transfers.ordernumber_from = ? ) ';
+        push @args, ( $ordernumber, $ordernumber );
+    }
+    if ( $biblionumber ) {
+        $query .= 'AND aqorders.biblionumber = ?';
+        push @args, $biblionumber;
     }
     if( $search ) {
         $query .= ' AND (biblio.title LIKE ? OR biblio.author LIKE ? OR biblioitems.isbn LIKE ?)';
@@ -1785,6 +1828,11 @@ sub SearchOrders {
         push @args, $userenv->{'number'};
     }
 
+    if ( $budget_id ) {
+        $query .= ' AND aqorders.budget_id = ?';
+        push @args, $budget_id;
+    }
+
     $query .= ' ORDER BY aqbasket.basketno';
 
     my $sth = $dbh->prepare($query);
@@ -1816,7 +1864,12 @@ sub DelOrder {
     $sth->execute( $bibnum, $ordernumber );
     my @itemnumbers = GetItemnumbersFromOrder( $ordernumber );
     foreach my $itemnumber (@itemnumbers){
-        C4::Items::DelItem( $dbh, $bibnum, $itemnumber );
+        C4::Items::DelItem(
+            {
+                biblionumber => $bibnum,
+                itemnumber   => $itemnumber
+            }
+        );
     }
     return;
 }
@@ -2069,6 +2122,9 @@ sub GetLateOrders {
     SELECT aqbasket.basketno,
         aqorders.ordernumber,
         DATE(aqbasket.closedate)  AS orderdate,
+        aqbasket.basketname       AS basketname,
+        aqbasket.basketgroupid    AS basketgroupid,
+        aqbasketgroups.name       AS basketgroupname,
         aqorders.rrp              AS unitpricesupplier,
         aqorders.ecost            AS unitpricelib,
         aqorders.claims_count     AS claims_count,
@@ -2089,6 +2145,7 @@ sub GetLateOrders {
         LEFT JOIN aqbudgets           ON aqorders.budget_id          = aqbudgets.budget_id,
         aqbasket LEFT JOIN borrowers  ON aqbasket.authorisedby       = borrowers.borrowernumber
         LEFT JOIN aqbooksellers       ON aqbasket.booksellerid       = aqbooksellers.id
+        LEFT JOIN aqbasketgroups      ON aqbasket.basketgroupid      = aqbasketgroups.id
         WHERE aqorders.basketno = aqbasket.basketno
         AND ( datereceived = ''
             OR datereceived IS NULL
@@ -2160,8 +2217,6 @@ sub GetLateOrders {
     $sth->execute(@query_params);
     my @results;
     while (my $data = $sth->fetchrow_hashref) {
-        $data->{orderdate} = format_date($data->{orderdate});
-        $data->{claimed_date} = format_date($data->{claimed_date});
         push @results, $data;
     }
     return @results;
@@ -2235,6 +2290,8 @@ sub GetHistory {
     my $orderstatus = $params{orderstatus};
     my $biblionumber = $params{biblionumber};
     my $get_canceled_order = $params{get_canceled_order} || 0;
+    my $ordernumber = $params{ordernumber};
+    my $search_children_too = $params{search_children_too} || 0;
 
     my @order_loop;
     my $total_qty         = 0;
@@ -2362,6 +2419,17 @@ sub GetHistory {
         push @query_params, "%$basketgroupname%";
     }
 
+    if ($ordernumber) {
+        $query .= " AND (aqorders.ordernumber = ? ";
+        push @query_params, $ordernumber;
+        if ($search_children_too) {
+            $query .= " OR aqorders.parent_ordernumber = ? ";
+            push @query_params, $ordernumber;
+        }
+        $query .= ") ";
+    }
+
+
     if ( C4::Context->preference("IndependentBranches") ) {
         unless ( C4::Context->IsSuperLibrarian() ) {
             $query .= " AND (borrowers.branchcode = ? OR borrowers.branchcode ='' ) ";
@@ -2406,72 +2474,8 @@ sub GetRecentAcqui {
     return $results;
 }
 
-=head3 GetContracts
-
-  $contractlist = &GetContracts($booksellerid, $activeonly);
-
-Looks up the contracts that belong to a bookseller
-
-Returns a list of contracts
-
-=over
-
-=item C<$booksellerid> is the "id" field in the "aqbooksellers" table.
-
-=item C<$activeonly> if exists get only contracts that are still active.
-
-=back
-
-=cut
-
-sub GetContracts {
-    my ( $booksellerid, $activeonly ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $query;
-    if (! $activeonly) {
-        $query = "
-            SELECT *
-            FROM   aqcontract
-            WHERE  booksellerid=?
-        ";
-    } else {
-        $query = "SELECT *
-            FROM aqcontract
-            WHERE booksellerid=?
-                AND contractenddate >= CURDATE( )";
-    }
-    my $result_set =
-      $dbh->selectall_arrayref( $query, { Slice => {} }, $booksellerid );
-    return @{$result_set};
-}
-
 #------------------------------------------------------------#
 
-=head3 GetContract
-
-  $contract = &GetContract($contractID);
-
-Looks up the contract that has PRIMKEY (contractnumber) value $contractID
-
-Returns a contract
-
-=cut
-
-sub GetContract {
-    my ( $contractno ) = @_;
-    my $dbh = C4::Context->dbh;
-    my $query = "
-        SELECT *
-        FROM   aqcontract
-        WHERE  contractnumber=?
-        ";
-
-    my $sth = $dbh->prepare($query);
-    $sth->execute( $contractno );
-    my $result = $sth->fetchrow_hashref;
-    return $result;
-}
-
 =head3 AddClaim
 
 =over
@@ -2542,6 +2546,13 @@ sub GetInvoices {
               NULL
             )
           ) AS receivedbiblios,
+          COUNT(
+             DISTINCT IF(
+              aqorders.subscriptionid IS NOT NULL,
+              aqorders.subscriptionid,
+              NULL
+            )
+          ) AS is_linked_to_subscriptions,
           SUM(aqorders.quantityreceived) AS receiveditems
         FROM aqinvoices
           LEFT JOIN aqbooksellers ON aqbooksellers.id = aqinvoices.booksellerid