Bug 19479: Display price in basket group formatted according to CurrencyFormat syspre...
[koha.git] / acqui / addorderiso2709.pl
index 1469817..3ce7e1e 100755 (executable)
@@ -44,8 +44,9 @@ 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;
 
@@ -78,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
@@ -101,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' );
 
@@ -245,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
@@ -267,22 +270,12 @@ if ($op eq ""){
                         $orderinfo{tax_rate} = $bookseller->tax_rate;
                         my $c = $c_discount ? $c_discount : $bookseller->discount / 100;
                         $orderinfo{discount} = $c;
-                        if ( $bookseller->listincgst ) {
-                            if ( $c_discount ) {
-                                $orderinfo{ecost} = $price;
-                                $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
-                            } else {
-                                $orderinfo{ecost} = $price * ( 1 - $c );
-                                $orderinfo{rrp}   = $price;
-                            }
+                        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};
@@ -305,8 +298,8 @@ if ($op eq ""){
                         )
                     };
 
-                    my $order = Koha::Acquisition::Order->new( \%orderinfo )->insert;
-                    $order->add_item( $_ ) for @itemnumbers;
+                    my $order = Koha::Acquisition::Order->new( \%orderinfo )->store;
+                    $order->add_item( $_ ) for @{ $budget_hash->{$budget_id}->{itemnumbers} };
                 }
             }
         } else {
@@ -337,22 +330,12 @@ if ($op eq ""){
                 $orderinfo{tax_rate} = $bookseller->tax_rate;
                 my $c = $c_discount ? $c_discount : $bookseller->discount / 100;
                 $orderinfo{discount} = $c;
-                if ( $bookseller->listincgst ) {
-                    if ( $c_discount ) {
-                        $orderinfo{ecost} = $price;
-                        $orderinfo{rrp}   = $orderinfo{ecost} / ( 1 - $c );
-                    } else {
-                        $orderinfo{ecost} = $price * ( 1 - $c );
-                        $orderinfo{rrp}   = $price;
-                    }
+                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};
@@ -375,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');
@@ -705,18 +687,21 @@ sub get_infos_syspref {
 
 sub equal_number_of_fields {
     my ($tags_list, $record) = @_;
-    my $refcount = 0;
-    my $count = 0;
+    my $tag_fields_count;
     for my $tag (@$tags_list) {
-        return -1 if $count != $refcount;
-        $count = 0;
-        for my $field ($record->field($tag)) {
-            $count++;
+        my @fields = $record->field($tag);
+        $tag_fields_count->{$tag} = scalar @fields;
+    }
+
+    my $tags_count;
+    foreach my $key ( keys %$tag_fields_count ) {
+        if ( $tag_fields_count->{$key} > 0 ) { # Having 0 of a field is ok
+            $tags_count //= $tag_fields_count->{$key}; # Start with the count from the first occurrence
+            return -1 if $tag_fields_count->{$key} != $tags_count; # All counts of various fields should be equal if they exist
         }
-        $refcount = $count if ($refcount == 0);
     }
-    return -1 if $count != $refcount;
-    return $count;
+
+    return $tags_count;
 }
 
 sub get_infos_syspref_on_item {
@@ -746,7 +731,7 @@ sub get_infos_syspref_on_item {
     @tags_list = List::MoreUtils::uniq(@tags_list);
 
     my $tags_count = equal_number_of_fields(\@tags_list, $record);
-    # Return if the number of theses fields in the record is not the same.
+    # Return if the number of these fields in the record is not the same.
     return -1 if $tags_count == -1;
 
     # Gather the fields
@@ -767,7 +752,7 @@ sub get_infos_syspref_on_item {
             for my $field ( @fields ) {
                 my ( $f, $sf ) = split /\$/, $field;
                 next unless $f and $sf;
-                my $v = $fields_hash->{$f}[$i]->subfield( $sf );
+                my $v = $fields_hash->{$f}[$i] ? $fields_hash->{$f}[$i]->subfield( $sf ) : undef;
                 $r->{$field_name} = $v if (defined $v);
                 last if $yaml->{$field};
             }