Bug 7736: Support Ordering via Edifact EDI messages
[srvgit] / acqui / basket.pl
index 5366bf8..0a0cbda 100755 (executable)
@@ -7,35 +7,37 @@
 #
 # 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 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 3 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.
+# 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.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use strict;
 use warnings;
 use C4::Auth;
 use C4::Koha;
 use C4::Output;
-use CGI;
+use CGI qw ( -utf8 );
 use C4::Acquisition;
 use C4::Budgets;
 use C4::Branch;
-use C4::Bookseller qw( GetBookSellerFromId);
+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 Date::Calc qw/Add_Delta_Days/;
+use Koha::Database;
+use Koha::EDI qw( create_edi_order get_edifact_ean );
 
 =head1 NAME
 
@@ -67,7 +69,9 @@ the supplier this script have to display the basket.
 
 my $query        = new CGI;
 our $basketno     = $query->param('basketno');
+my $ean          = $query->param('ean');
 my $booksellerid = $query->param('booksellerid');
+my $duplinbatch =  $query->param('duplinbatch');
 
 my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
     {
@@ -82,7 +86,11 @@ my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
 
 my $basket = GetBasket($basketno);
 $booksellerid = $basket->{booksellerid} unless $booksellerid;
-my ($bookseller) = GetBookSellerFromId($booksellerid);
+my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $booksellerid });
+my $schema = Koha::Database->new()->schema();
+my $rs = $schema->resultset('VendorEdiAccount')->search(
+    { vendor_id => $booksellerid, } );
+$template->param( ediaccount => ($rs->count > 0));
 
 unless (CanUserManageBasket($loggedinuser, $basket, $userflags)) {
     $template->param(
@@ -150,45 +158,6 @@ if ( $op eq 'delete_confirm' ) {
     $template->param( delete_confirmed => 1 );
 } elsif ( !$bookseller ) {
     $template->param( NO_BOOKSELLER => 1 );
-} elsif ( $op eq 'del_basket') {
-    $template->param( delete_confirm => 1 );
-    if ( C4::Context->preference("IndependentBranches") ) {
-        my $userenv = C4::Context->userenv;
-        unless ( C4::Context->IsSuperLibrarian() ) {
-            my $validtest = ( $basket->{creationdate} eq '' )
-              || ( $userenv->{branch} eq $basket->{branch} )
-              || ( $userenv->{branch} eq '' )
-              || ( $basket->{branch}  eq '' );
-            unless ($validtest) {
-                print $query->redirect("../mainpage.pl");
-                exit 1;
-            }
-        }
-    }
-    $basket->{creationdate} = ""            unless ( $basket->{creationdate} );
-    $basket->{authorisedby} = $loggedinuser unless ( $basket->{authorisedby} );
-    my $contract = &GetContract($basket->{contractnumber});
-    $template->param(
-        basketno             => $basketno,
-        basketname           => $basket->{'basketname'},
-        basketnote           => $basket->{note},
-        basketbooksellernote => $basket->{booksellernote},
-        basketcontractno     => $basket->{contractnumber},
-        basketcontractname   => $contract->{contractname},
-        creationdate         => $basket->{creationdate},
-        authorisedby         => $basket->{authorisedby},
-        authorisedbyname     => $basket->{authorisedbyname},
-        closedate            => $basket->{closedate},
-        deliveryplace        => $basket->{deliveryplace},
-        billingplace         => $basket->{billingplace},
-        active               => $bookseller->{'active'},
-        booksellerid         => $bookseller->{'id'},
-        name                 => $bookseller->{'name'},
-        address1             => $bookseller->{'address1'},
-        address2             => $bookseller->{'address2'},
-        address3             => $bookseller->{'address3'},
-        address4             => $bookseller->{'address4'},
-      );
 } elsif ($op eq 'export') {
     print $query->header(
         -type       => 'text/csv',
@@ -234,8 +203,11 @@ if ( $op eq 'delete_confirm' ) {
 } elsif ($op eq 'reopen') {
     ReopenBasket($query->param('basketno'));
     print $query->redirect('/cgi-bin/koha/acqui/basket.pl?basketno='.$basket->{'basketno'})
+}
+elsif ( $op eq 'ediorder' ) {
+    edi_close_and_order()
 } elsif ( $op eq 'mod_users' ) {
-    my $basketusers_ids = $query->param('basketusers_ids');
+    my $basketusers_ids = $query->param('users_ids');
     my @basketusers = split( /:/, $basketusers_ids );
     ModBasketUsers($basketno, @basketusers);
     print $query->redirect("/cgi-bin/koha/acqui/basket.pl?basketno=$basketno");
@@ -310,7 +282,7 @@ if ( $op eq 'delete_confirm' ) {
     if( $basket->{closedate} ) {
         my ($year, $month, $day) = ($basket->{closedate} =~ /(\d+)-(\d+)-(\d+)/);
         ($year, $month, $day) = Add_Delta_Days($year, $month, $day, $bookseller->{deliverytime});
-        $estimateddeliverydate = "$year-$month-$day";
+        $estimateddeliverydate = sprintf( "%04d-%02d-%02d", $year, $month, $day );
     }
 
     # if new basket, pre-fill infos
@@ -328,11 +300,9 @@ if ( $op eq 'delete_confirm' ) {
         push @basketusers, $basketuser if $basketuser;
     }
 
-    #to get active currency
-    my $cur = GetCurrency();
+    my $active_currency = Koha::Acquisition::Currencies->get_active;
 
-
-    my @results = GetOrders( $basketno );
+    my @orders = GetOrders( $basketno );
     my @books_loop;
 
     my @book_foot_loop;
@@ -341,7 +311,8 @@ if ( $op eq 'delete_confirm' ) {
     my $total_gste = 0;
     my $total_gsti = 0;
     my $total_gstvalue = 0;
-    for my $order (@results) {
+    for my $order (@orders) {
+        $order = C4::Acquisition::populate_order_with_prices({ order => $order, booksellerid => $booksellerid, ordering => 1 });
         my $line = get_order_infos( $order, $bookseller);
         if ( $line->{uncertainprice} ) {
             $template->param( uncertainprices => 1 );
@@ -349,29 +320,31 @@ if ( $op eq 'delete_confirm' ) {
 
         push @books_loop, $line;
 
-        $foot{$$line{gstgsti}}{gstgsti} = $$line{gstgsti};
-        $foot{$$line{gstgsti}}{gstvalue} += $$line{gstvalue};
+        $foot{$$line{gstrate}}{gstrate} = $$line{gstrate};
+        $foot{$$line{gstrate}}{gstvalue} += $$line{gstvalue};
         $total_gstvalue += $$line{gstvalue};
-        $foot{$$line{gstgsti}}{quantity}  += $$line{quantity};
+        $foot{$$line{gstrate}}{quantity}  += $$line{quantity};
         $total_quantity += $$line{quantity};
-        $foot{$$line{gstgsti}}{totalgste} += $$line{totalgste};
+        $foot{$$line{gstrate}}{totalgste} += $$line{totalgste};
         $total_gste += $$line{totalgste};
-        $foot{$$line{gstgsti}}{totalgsti} += $$line{totalgsti};
+        $foot{$$line{gstrate}}{totalgsti} += $$line{totalgsti};
         $total_gsti += $$line{totalgsti};
     }
 
     push @book_foot_loop, map {$_} values %foot;
 
     # Get cancelled orders
-    @results = GetCancelledOrders($basketno);
+    my @cancelledorders = GetOrders($basketno, { cancelled => 1 });
     my @cancelledorders_loop;
-    for my $order (@results) {
+    for my $order (@cancelledorders) {
+        $order = C4::Acquisition::populate_order_with_prices({ order => $order, booksellerid => $booksellerid, ordering => 1 });
         my $line = get_order_infos( $order, $bookseller);
         push @cancelledorders_loop, $line;
     }
 
-    my $contract = &GetContract($basket->{contractnumber});
-    my @orders = GetOrders($basketno);
+    my $contract = GetContract({
+        contractnumber => $basket->{contractnumber}
+    });
 
     if ($basket->{basketgroupid}){
         $basketgroup = GetBasketgroup($basket->{basketgroupid});
@@ -403,8 +376,8 @@ if ( $op eq 'delete_confirm' ) {
         creationdate         => $basket->{creationdate},
         authorisedby         => $basket->{authorisedby},
         authorisedbyname     => $basket->{authorisedbyname},
-        basketusers_ids      => join(':', @basketusers_ids),
-        basketusers          => \@basketusers,
+        users_ids            => join(':', @basketusers_ids),
+        users                => \@basketusers,
         closedate            => $basket->{closedate},
         estimateddeliverydate=> $estimateddeliverydate,
         deliveryplace        => C4::Branch::GetBranchName( $basket->{deliveryplace} ),
@@ -419,13 +392,14 @@ if ( $op eq 'delete_confirm' ) {
         total_gste           => sprintf( "%.2f", $total_gste ),
         total_gsti           => sprintf( "%.2f", $total_gsti ),
         total_gstvalue       => sprintf( "%.2f", $total_gstvalue ),
-        currency             => $cur->{'currency'},
+        currency             => $active_currency->currency,
         listincgst           => $bookseller->{listincgst},
         basketgroups         => $basketgroups,
         basketgroup          => $basketgroup,
         grouped              => $basket->{basketgroupid},
         unclosable           => @orders ? 0 : 1, 
         has_budgets          => $has_budgets,
+        duplinbatch          => $duplinbatch,
     );
 }
 
@@ -442,28 +416,6 @@ sub get_order_infos {
     $line{order_received} = ( $qty == $order->{'quantityreceived'} );
     $line{basketno}       = $basketno;
     $line{budget_name}    = $budget->{budget_name};
-    $line{rrp} = ConvertCurrency( $order->{'currency'}, $line{rrp} ); # FIXME from comm
-    if ( $bookseller->{'listincgst'} ) {
-        $line{rrpgsti} = sprintf( "%.2f", $line{rrp} );
-        $line{gstgsti} = sprintf( "%.2f", $line{gstrate} * 100 );
-        $line{rrpgste} = sprintf( "%.2f", $line{rrp} / ( 1 + ( $line{gstgsti} / 100 ) ) );
-        $line{gstgste} = sprintf( "%.2f", $line{gstgsti} / ( 1 + ( $line{gstgsti} / 100 ) ) );
-        $line{ecostgsti} = sprintf( "%.2f", $line{ecost} );
-        $line{ecostgste} = sprintf( "%.2f", $line{ecost} / ( 1 + ( $line{gstgsti} / 100 ) ) );
-        $line{gstvalue} = sprintf( "%.2f", ( $line{ecostgsti} - $line{ecostgste} ) * $line{quantity});
-        $line{totalgste} = sprintf( "%.2f", $order->{quantity} * $line{ecostgste} );
-        $line{totalgsti} = sprintf( "%.2f", $order->{quantity} * $line{ecostgsti} );
-    } else {
-        $line{rrpgsti} = sprintf( "%.2f", $line{rrp} * ( 1 + ( $line{gstrate} ) ) );
-        $line{rrpgste} = sprintf( "%.2f", $line{rrp} );
-        $line{gstgsti} = sprintf( "%.2f", $line{gstrate} * 100 );
-        $line{gstgste} = sprintf( "%.2f", $line{gstrate} * 100 );
-        $line{ecostgsti} = sprintf( "%.2f", $line{ecost} * ( 1 + ( $line{gstrate} ) ) );
-        $line{ecostgste} = sprintf( "%.2f", $line{ecost} );
-        $line{gstvalue} = sprintf( "%.2f", ( $line{ecostgsti} - $line{ecostgste} ) * $line{quantity});
-        $line{totalgste} = sprintf( "%.2f", $order->{quantity} * $line{ecostgste} );
-        $line{totalgsti} = sprintf( "%.2f", $order->{quantity} * $line{ecostgsti} );
-    }
 
     if ( $line{uncertainprice} ) {
         $line{rrpgste} .= ' (Uncertain)';
@@ -473,8 +425,6 @@ sub get_order_infos {
         my $seriestitle = $order->{'seriestitle'};
         $line{'title'} .= " / $seriestitle" if $seriestitle;
         $line{'title'} .= " / $volume"      if $volume;
-    } else {
-        $line{'title'} = "Deleted bibliographic notice, can't find title.";
     }
 
     my $biblionumber = $order->{'biblionumber'};
@@ -514,7 +464,7 @@ sub get_order_infos {
         if ($line{$key}) {
             my $order = GetOrder($line{$key});
             my $basket = GetBasket($order->{basketno});
-            my $bookseller = GetBookSellerFromId($basket->{booksellerid});
+            my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $basket->{booksellerid} });
             $line{$key} = {
                 order => $order,
                 basket => $basket,
@@ -528,3 +478,70 @@ sub get_order_infos {
 }
 
 output_html_with_http_headers $query, $cookie, $template->output;
+
+
+sub edi_close_and_order {
+    my $confirm = $query->param('confirm') || $confirm_pref eq '2';
+    if ($confirm) {
+            my $edi_params = {
+                basketno => $basketno,
+                ean    => $ean,
+            };
+            if ( $basket->{branch} ) {
+                $edi_params->{branchcode} = $basket->{branch};
+            }
+            if ( create_edi_order($edi_params) ) {
+                #$template->param( edifile => 1 );
+            }
+        CloseBasket($basketno);
+
+        # if requested, create basket group, close it and attach the basket
+        if ( $query->param('createbasketgroup') ) {
+            my $branchcode;
+            if (    C4::Context->userenv
+                and C4::Context->userenv->{'branch'}
+                and C4::Context->userenv->{'branch'} ne "NO_LIBRARY_SET" )
+            {
+                $branchcode = C4::Context->userenv->{'branch'};
+            }
+            my $basketgroupid = NewBasketgroup(
+                {
+                    name          => $basket->{basketname},
+                    booksellerid  => $booksellerid,
+                    deliveryplace => $branchcode,
+                    billingplace  => $branchcode,
+                    closed        => 1,
+                }
+            );
+            ModBasket(
+                {
+                    basketno      => $basketno,
+                    basketgroupid => $basketgroupid
+                }
+            );
+            print $query->redirect(
+"/cgi-bin/koha/acqui/basketgroup.pl?booksellerid=$booksellerid&closed=1"
+            );
+        }
+        else {
+            print $query->redirect(
+                "/cgi-bin/koha/acqui/booksellers.pl?booksellerid=$booksellerid"
+            );
+        }
+        exit;
+    }
+    else {
+        $template->param(
+            edi_confirm     => 1,
+            booksellerid    => $booksellerid,
+            basketno        => $basket->{basketno},
+            basketname      => $basket->{basketname},
+            basketgroupname => $basket->{basketname},
+        );
+        if ($ean) {
+            $template->param( ean => $ean );
+        }
+
+    }
+    return;
+}