Bug 21622: Adjust incorrect GROUP BY clauses in acqui script
[koha.git] / acqui / basket.pl
index 0677e33..1b55e74 100755 (executable)
@@ -30,16 +30,18 @@ use C4::Budgets;
 use C4::Contract;
 use C4::Debug;
 use C4::Biblio;
-use C4::Members qw/GetMember/;  #needed for permissions checking for changing basketgroup of a basket
 use C4::Items;
 use C4::Suggestions;
 use Koha::Biblios;
 use Koha::Acquisition::Booksellers;
+use Koha::Acquisition::Orders;
 use Koha::Libraries;
 use C4::Letters qw/SendAlerts/;
 use Date::Calc qw/Add_Delta_Days/;
 use Koha::Database;
 use Koha::EDI qw( create_edi_order get_edifact_ean );
+use Koha::CsvProfiles;
+use Koha::Patrons;
 
 =head1 NAME
 
@@ -69,13 +71,13 @@ the supplier this script have to display the basket.
 
 =cut
 
-my $query        = new CGI;
+our $query        = new CGI;
 our $basketno     = $query->param('basketno');
-my $ean          = $query->param('ean');
-my $booksellerid = $query->param('booksellerid');
+our $ean          = $query->param('ean');
+our $booksellerid = $query->param('booksellerid');
 my $duplinbatch =  $query->param('duplinbatch');
 
-my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
+our ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
     {
         template_name   => "acqui/basket.tt",
         query           => $query,
@@ -86,7 +88,7 @@ my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
     }
 );
 
-my $basket = GetBasket($basketno);
+our $basket = GetBasket($basketno);
 $booksellerid = $basket->{booksellerid} unless $booksellerid;
 my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
 my $schema = Koha::Database->new()->schema();
@@ -100,7 +102,7 @@ unless (CanUserManageBasket($loggedinuser, $basket, $userflags)) {
         basketno => $basketno,
         basketname => $basket->{basketname},
         booksellerid => $booksellerid,
-        name => $bookseller->name,
+        booksellername => $bookseller->name,
     );
     output_html_with_http_headers $query, $cookie, $template->output;
     exit;
@@ -112,7 +114,7 @@ unless (CanUserManageBasket($loggedinuser, $basket, $userflags)) {
 # warn "=>".$basket->{booksellerid};
 my $op = $query->param('op') // 'list';
 
-my $confirm_pref= C4::Context->preference("BasketConfirmations") || '1';
+our $confirm_pref= C4::Context->preference("BasketConfirmations") || '1';
 $template->param( skip_confirm_reopen => 1) if $confirm_pref eq '2';
 
 my @messages;
@@ -133,10 +135,10 @@ if ( $op eq 'delete_confirm' ) {
             my $biblio = Koha::Biblios->find( $biblionumber );
             my $countbiblio = CountBiblioInOrders($biblionumber);
             my $ordernumber = $myorder->{'ordernumber'};
-            my $subscriptions = scalar GetSubscriptionsId ($biblionumber);
+            my $cnt_subscriptions = $biblio->subscriptions->count;
             my $itemcount = $biblio->items->count;
             my $error;
-            if ($countbiblio == 0 && $itemcount == 0 && $subscriptions == 0) {
+            if ($countbiblio == 0 && $itemcount == 0 && not $cnt_subscriptions ) {
                 $error = DelBiblio($myorder->{biblionumber}) }
             else {
                 push @cannotdelbiblios, {biblionumber=> ($myorder->{biblionumber}),
@@ -144,7 +146,7 @@ if ( $op eq 'delete_confirm' ) {
                                          author=> $myorder->{'author'},
                                          countbiblio=> $countbiblio,
                                          itemcount=>$itemcount,
-                                         subscriptions=>$subscriptions};
+                                         subscriptions => $cnt_subscriptions};
             }
             if ($error) {
                 push @cannotdelbiblios, {biblionumber=> ($myorder->{biblionumber}),
@@ -159,7 +161,7 @@ if ( $op eq 'delete_confirm' ) {
     DelBasket($basketno,);
     $template->param(
         delete_confirmed => 1,
-        name => $bookseller->name,
+        booksellername => $bookseller->name,
         booksellerid => $booksellerid,
     );
 } elsif ( !$bookseller ) {
@@ -169,7 +171,8 @@ if ( $op eq 'delete_confirm' ) {
         -type       => 'text/csv',
         -attachment => 'basket' . $basket->{'basketno'} . '.csv',
     );
-    print GetBasketAsCSV($query->param('basketno'), $query);
+    my $csv_profile_id = $query->param('csv_profile');
+    print GetBasketAsCSV( scalar $query->param('basketno'), $query, $csv_profile_id ); # if no csv_profile_id passed, using default rows
     exit;
 } elsif ($op eq 'email') {
     my $err = eval {
@@ -214,13 +217,14 @@ if ( $op eq 'delete_confirm' ) {
     $template->param(
         confirm_close   => "1",
         booksellerid    => $booksellerid,
+        booksellername  => $bookseller->name,
         basketno        => $basket->{'basketno'},
         basketname      => $basket->{'basketname'},
         basketgroupname => $basket->{'basketname'},
     );
     }
 } elsif ($op eq 'reopen') {
-    ReopenBasket($query->param('basketno'));
+    ReopenBasket(scalar $query->param('basketno'));
     print $query->redirect('/cgi-bin/koha/acqui/basket.pl?basketno='.$basket->{'basketno'})
 }
 elsif ( $op eq 'ediorder' ) {
@@ -285,8 +289,8 @@ if ( $op eq 'list' ) {
 
 #if the basket is closed,and the user has the permission to edit basketgroups, display a list of basketgroups
     my ($basketgroup, $basketgroups);
-    my $staffuser = GetMember(borrowernumber => $loggedinuser);
-    if ($basket->{closedate} && haspermission($staffuser->{userid}, { acquisition => 'group_manage'} )) {
+    my $patron = Koha::Patrons->find($loggedinuser);
+    if ($basket->{closedate} && haspermission($patron->userid, { acquisition => 'group_manage'} )) {
         $basketgroups = GetBasketgroups($basket->{booksellerid});
         for my $bg ( @{$basketgroups} ) {
             if ($basket->{basketgroupid} && $basket->{basketgroupid} == $bg->{id}){
@@ -315,8 +319,9 @@ if ( $op eq 'list' ) {
     my @basketusers_ids = GetBasketUsers($basketno);
     my @basketusers;
     foreach my $basketuser_id (@basketusers_ids) {
-        my $basketuser = GetMember(borrowernumber => $basketuser_id);
-        push @basketusers, $basketuser if $basketuser;
+        # FIXME Could be improved with a search -in
+        my $basket_patron = Koha::Patrons->find( $basketuser_id );
+        push @basketusers, $basket_patron if $basket_patron;
     }
 
     my $active_currency = Koha::Acquisition::Currencies->get_active;
@@ -336,8 +341,8 @@ if ( $op eq 'list' ) {
             $template->param( uncertainprices => 1 );
         }
 
-        $line->{tax_rate} = $line->{tax_rate_on_ordering};
-        $line->{tax_value} = $line->{tax_value_on_ordering};
+        $line->{tax_rate} = $line->{tax_rate_on_ordering} // 0;
+        $line->{tax_value} = $line->{tax_value_on_ordering} // 0;
 
         push @books_loop, $line;
 
@@ -369,7 +374,6 @@ if ( $op eq 'list' ) {
     if ($basket->{basketgroupid}){
         $basketgroup = GetBasketgroup($basket->{basketgroupid});
     }
-    my $borrower= GetMember('borrowernumber' => $loggedinuser);
     my $budgets = GetBudgetHierarchy;
     my $has_budgets = 0;
     foreach my $r (@{$budgets}) {
@@ -404,7 +408,7 @@ if ( $op eq 'list' ) {
         billingplace         => $basket->{billingplace},
         active               => $bookseller->active,
         booksellerid         => $bookseller->id,
-        name                 => $bookseller->name,
+        booksellername       => $bookseller->name,
         books_loop           => \@books_loop,
         book_foot_loop       => \@book_foot_loop,
         cancelledorders_loop => \@cancelledorders_loop,
@@ -425,6 +429,7 @@ if ( $op eq 'list' ) {
         unclosable           => @orders ? $basket->{is_standing} : 1,
         has_budgets          => $has_budgets,
         duplinbatch          => $duplinbatch,
+        csv_profiles         => [ Koha::CsvProfiles->search({ type => 'sql', used_for => 'export_basket' }) ],
     );
 }
 
@@ -463,27 +468,30 @@ sub get_order_infos {
     }
 
     my $biblionumber = $order->{'biblionumber'};
-    my $biblio = Koha::Biblios->find( $biblionumber );
-    my $countbiblio = CountBiblioInOrders($biblionumber);
-    my $ordernumber = $order->{'ordernumber'};
-    my @subscriptions = GetSubscriptionsId ($biblionumber);
-    my $itemcount   = $biblio->items->count;
-    my $holds_count = $biblio->holds->count;
-    my @items = GetItemnumbersFromOrder( $ordernumber );
-    my $itemholds  = $biblio ? $biblio->holds->search({ itemnumber => { -in => \@items } })->count : 0;
-
-    # 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_count);
-    $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;
-    ($holds_count >= 1) ? $line{left_holds} = 1 : $line{left_holds} = 0;
-    $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
-    $line{holds}                = $holds_count;
-    $line{holds_on_order}       = $itemholds?$itemholds:$holds_count if $line{left_holds_on_order};
+    if ( $biblionumber ) { # The biblio still exists
+        my $biblio = Koha::Biblios->find( $biblionumber );
+        my $countbiblio = CountBiblioInOrders($biblionumber);
+        my $ordernumber = $order->{'ordernumber'};
+        my $cnt_subscriptions = $biblio->subscriptions->count;
+        my $itemcount   = $biblio->items->count;
+        my $holds_count = $biblio->holds->count;
+        my $order = Koha::Acquisition::Orders->find($ordernumber); # FIXME We should certainly do that at the beginning of this sub
+        my $items = $order->items;
+        my $itemholds  = $biblio->holds->search({ itemnumber => { -in => [ $items->get_column('itemnumber') ] } })->count;
+
+        # 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 == $items->count && !($cnt_subscriptions) && !($holds_count);
+        $line{items}                = $itemcount - $items->count;
+        $line{left_item}            = 1 if $line{items} >= 1;
+        $line{left_biblio}          = 1 if $countbiblio > 1;
+        $line{biblios}              = $countbiblio - 1;
+        $line{left_subscription}    = 1 if $cnt_subscriptions;
+        $line{subscriptions}        = $cnt_subscriptions;
+        ($holds_count >= 1) ? $line{left_holds} = 1 : $line{left_holds} = 0;
+        $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
+        $line{holds}                = $holds_count;
+        $line{holds_on_order}       = $itemholds?$itemholds:$holds_count if $line{left_holds_on_order};
+    }
 
 
     my $suggestion   = GetSuggestionInfoFromBiblionumber($line{biblionumber});
@@ -494,6 +502,7 @@ sub get_order_infos {
     foreach my $key (qw(transferred_from transferred_to)) {
         if ($line{$key}) {
             my $order = GetOrder($line{$key});
+            my $basket = GetBasket($order->{basketno});
             my $bookseller = Koha::Acquisition::Booksellers->find( $basket->{booksellerid} );
             $line{$key} = {
                 order => $order,