Bug 19296: Allow all tax processing to happen in C4::Acquisition::populate_order_with...
[koha.git] / acqui / addorderiso2709.pl
index bd0f4eb..0e0793b 100755 (executable)
@@ -2,7 +2,7 @@
 
 #A script that lets the user populate a basket from an iso2709 file
 #the script first displays a list of import batches, then when a batch is selected displays all the biblios in it.
-#The user can then pick which biblios he or she wants to order
+#The user can then pick which biblios they want to order
 
 # Copyright 2008 - 2011 BibLibre SARL
 #
@@ -44,9 +44,11 @@ use C4::Members;
 
 use Koha::Number::Price;
 use Koha::Libraries;
+use Koha::Acquisition::Baskets;
 use Koha::Acquisition::Currencies;
-use Koha::Acquisition::Order;
+use Koha::Acquisition::Orders;
 use Koha::Acquisition::Booksellers;
+use Koha::Patrons;
 
 my $input = new CGI;
 my ($template, $loggedinuser, $cookie, $userflags) = get_template_and_user({
@@ -77,6 +79,7 @@ if ($cgiparams->{'import_batch_id'} && $op eq ""){
 if (! $cgiparams->{'basketno'}){
     die "Basketnumber required to order from iso2709 file import";
 }
+my $basket = Koha::Acquisition::Baskets->find( $cgiparams->{basketno} );
 
 #
 # 1st step = choose the file to import into acquisition
@@ -100,8 +103,7 @@ if ($op eq ""){
                      "allmatch" => $allmatch,
                      );
     import_biblios_list($template, $cgiparams->{'import_batch_id'});
-    my $basket = GetBasket($cgiparams->{basketno});
-    if ( C4::Context->preference('AcqCreateItem') eq 'ordering' && !$basket->{is_standing} ) {
+    if ( $basket->effective_create_items eq 'ordering' && !$basket->is_standing ) {
         # prepare empty item form
         my $cell = PrepareItemrecordDisplay( '', '', '', 'ACQ' );
 
@@ -147,6 +149,7 @@ if ($op eq ""){
     my $biblio_count = 0;
     for my $biblio (@$biblios){
         $biblio_count++;
+        my $duplifound = 0;
         # Check if this import_record_id was selected
         next if not grep { $_ eq $$biblio{import_record_id} } @import_record_id_selected;
         my ( $marcblob, $encoding ) = GetImportRecordMarc( $biblio->{'import_record_id'} );
@@ -164,15 +167,15 @@ if ($op eq ""){
         unless ( $biblionumber ) {
             if ($matcher_id) {
                 if ( $matcher_id eq '_TITLE_AUTHOR_' ) {
-                    $duplinbatch = $import_batch_id if FindDuplicate($marcrecord);
+                    $duplifound = 1 if FindDuplicate($marcrecord);
                 }
                 else {
                     my $matcher = C4::Matcher->fetch($matcher_id);
                     my @matches = $matcher->get_matches( $marcrecord, my $max_matches = 1 );
-                    $duplinbatch = $import_batch_id if @matches;
+                    $duplifound = 1 if @matches;
                 }
 
-                next if $duplinbatch;
+                $duplinbatch = $import_batch_id and next if $duplifound;
             }
 
             # add the biblio
@@ -216,6 +219,8 @@ if ($op eq ""){
         my @replacementprices = $input->multi_param('replacementprice_' . $biblio_count);
         my @itemcallnumbers = $input->multi_param('itemcallnumber_' . $biblio_count);
         my $itemcreation = 0;
+
+        my @itemnumbers;
         for (my $i = 0; $i < $count; $i++) {
             $itemcreation = 1;
             my ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({
@@ -233,6 +238,7 @@ if ($op eq ""){
                 replacementprice => $replacementprices[$i],
                 itemcallnumber => $itemcallnumbers[$i],
             }, $biblionumber);
+            push( @itemnumbers, $itemnumber );
         }
         if ($itemcreation == 1) {
             # Group orderlines from MarcItemFieldsToOrder
@@ -240,6 +246,8 @@ if ($op eq ""){
             for (my $i = 0; $i < $count; $i++) {
                 $budget_hash->{$budget_codes[$i]}->{quantity} += 1;
                 $budget_hash->{$budget_codes[$i]}->{price} = $itemprices[$i];
+                $budget_hash->{$budget_codes[$i]}->{itemnumbers} //= [];
+                push @{ $budget_hash->{$budget_codes[$i]}->{itemnumbers} }, $itemnumbers[$i];
             }
 
             # Create orderlines from MarcItemFieldsToOrder
@@ -261,22 +269,13 @@ if ($op eq ""){
                         $price = Koha::Number::Price->new($price)->unformat;
                         $orderinfo{tax_rate} = $bookseller->tax_rate;
                         my $c = $c_discount ? $c_discount : $bookseller->discount / 100;
-                        if ( $bookseller->listincgst ) {
-                            if ( $c_discount ) {
-                                $orderinfo{ecost} = $price;
-                                $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
-                            } else {
-                                $orderinfo{ecost} = $price * ( 1 - $c );
-                                $orderinfo{rrp}   = $price;
-                            }
+                        $orderinfo{discount} = $c;
+                        if ( $c_discount ) {
+                            $orderinfo{ecost} = $price;
+                            $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
                         } else {
-                            if ( $c_discount ) {
-                                $orderinfo{ecost} = $price / ( 1 + $orderinfo{tax_rate} );
-                                $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
-                            } else {
-                                $orderinfo{rrp}   = $price / ( 1 + $orderinfo{tax_rate} );
-                                $orderinfo{ecost} = $orderinfo{rrp} * ( 1 - $c );
-                            }
+                            $orderinfo{ecost} = $price * ( 1 - $c );
+                            $orderinfo{rrp}   = $price;
                         }
                         $orderinfo{listprice} = $orderinfo{rrp} / $active_currency->rate;
                         $orderinfo{unitprice} = $orderinfo{ecost};
@@ -299,19 +298,20 @@ if ($op eq ""){
                         )
                     };
 
-                    my $order = Koha::Acquisition::Order->new( \%orderinfo )->insert;
+                    my $order = Koha::Acquisition::Order->new( \%orderinfo )->store;
+                    $order->add_item( $_ ) for @{ $budget_hash->{$budget_id}->{itemnumbers} };
                 }
             }
         } else {
             # 3rd add order
-            my $patron = C4::Members::GetMember( borrowernumber => $loggedinuser );
+            my $patron = Koha::Patrons->find( $loggedinuser );
             # get quantity in the MARC record (1 if none)
             my $quantity = GetMarcQuantity($marcrecord, C4::Context->preference('marcflavour')) || 1;
             my %orderinfo = (
                 biblionumber       => $biblionumber,
                 basketno           => $cgiparams->{'basketno'},
                 quantity           => $c_quantity,
-                branchcode         => $patron->{branchcode},
+                branchcode         => $patron->branchcode,
                 budget_id          => $c_budget_id,
                 uncertainprice     => 1,
                 sort1              => $c_sort1,
@@ -329,22 +329,13 @@ if ($op eq ""){
                 $price = Koha::Number::Price->new($price)->unformat;
                 $orderinfo{tax_rate} = $bookseller->tax_rate;
                 my $c = $c_discount ? $c_discount : $bookseller->discount / 100;
-                if ( $bookseller->listincgst ) {
-                    if ( $c_discount ) {
-                        $orderinfo{ecost} = $price;
-                        $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
-                    } else {
-                        $orderinfo{ecost} = $price * ( 1 - $c );
-                        $orderinfo{rrp}   = $price;
-                    }
+                $orderinfo{discount} = $c;
+                if ( $c_discount ) {
+                    $orderinfo{ecost} = $price;
+                    $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
                 } else {
-                    if ( $c_discount ) {
-                        $orderinfo{ecost} = $price / ( 1 + $orderinfo{tax_rate} );
-                        $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
-                    } else {
-                        $orderinfo{rrp}   = $price / ( 1 + $orderinfo{tax_rate} );
-                        $orderinfo{ecost} = $orderinfo{rrp} * ( 1 - $c );
-                    }
+                    $orderinfo{ecost} = $price * ( 1 - $c );
+                    $orderinfo{rrp}   = $price;
                 }
                 $orderinfo{listprice} = $orderinfo{rrp} / $active_currency->rate;
                 $orderinfo{unitprice} = $orderinfo{ecost};
@@ -367,13 +358,12 @@ if ($op eq ""){
             )
         };
 
-        my $order = Koha::Acquisition::Order->new( \%orderinfo )->insert;
+        my $order = Koha::Acquisition::Order->new( \%orderinfo )->store;
 
         # 4th, add items if applicable
         # parse the item sent by the form, and create an item just for the import_record_id we are dealing with
         # this is not optimised, but it's working !
-        my $basket = GetBasket($cgiparams->{basketno});
-        if ( C4::Context->preference('AcqCreateItem') eq 'ordering' && !$basket->{is_standing} ) {
+        if ( $basket->effective_create_items eq 'ordering' && !$basket->is_standing ) {
             my @tags         = $input->multi_param('tag');
             my @subfields    = $input->multi_param('subfield');
             my @field_values = $input->multi_param('field_value');
@@ -410,15 +400,14 @@ if ($op eq ""){
 my $budgets = GetBudgets();
 my $budget_id = @$budgets[0]->{'budget_id'};
 # build bookfund list
-my $borrower = GetMember( 'borrowernumber' => $loggedinuser );
-my ( $flags, $homebranch ) = ( $borrower->{'flags'}, $borrower->{'branchcode'} );
+my $patron = Koha::Patrons->find( $loggedinuser )->unblessed;
 my $budget = GetBudget($budget_id);
 
 # build budget list
 my $budget_loop = [];
 my $budgets_hierarchy = GetBudgetHierarchy;
 foreach my $r ( @{$budgets_hierarchy} ) {
-    next unless (CanUserUseBudget($borrower, $r, $userflags));
+    next unless (CanUserUseBudget($patron, $r, $userflags));
     if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) {
         next;
     }