Bug 12648: Link patrons to an order
[koha.git] / acqui / neworderempty.pl
index a461a1b..2966e8e 100755 (executable)
@@ -68,7 +68,7 @@ the item's id in the breeding reservoir
 
 use warnings;
 use strict;
-use CGI;
+use CGI qw ( -utf8 );
 use C4::Context;
 use C4::Input;
 
@@ -76,8 +76,8 @@ use C4::Auth;
 use C4::Budgets;
 use C4::Input;
 
-use C4::Bookseller  qw/ GetBookSellerFromId /;
 use C4::Acquisition;
+use C4::Contract;
 use C4::Suggestions;   # GetSuggestion
 use C4::Biblio;                        # GetBiblioData GetMarcPrice
 use C4::Items; #PrepareItemRecord
@@ -91,28 +91,30 @@ use C4::Search qw/FindDuplicate/;
 #needed for z3950 import:
 use C4::ImportBatch qw/GetImportRecordMarc SetImportRecordStatus/;
 
-my $input           = new CGI;
+use Koha::Acquisition::Bookseller;
+
+our $input           = new CGI;
 my $booksellerid    = $input->param('booksellerid');   # FIXME: else ERROR!
 my $budget_id       = $input->param('budget_id') || 0;
 my $title           = $input->param('title');
 my $author          = $input->param('author');
 my $publicationyear = $input->param('publicationyear');
-my $bookseller      = GetBookSellerFromId($booksellerid);      # FIXME: else ERROR!
 my $ordernumber          = $input->param('ordernumber') || '';
-my $biblionumber    = $input->param('biblionumber');
-my $basketno        = $input->param('basketno');
+our $biblionumber    = $input->param('biblionumber');
+our $basketno        = $input->param('basketno');
 my $suggestionid    = $input->param('suggestionid');
 my $close           = $input->param('close');
 my $uncertainprice  = $input->param('uncertainprice');
 my $import_batch_id = $input->param('import_batch_id'); # if this is filled, we come from a staged file, and we will return here after saving the order !
+my $subscriptionid  = $input->param('subscriptionid');
 my $data;
 my $new = 'no';
 
 my $budget_name;
 
-my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
+our ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
     {
-        template_name   => "acqui/neworderempty.tmpl",
+        template_name   => "acqui/neworderempty.tt",
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,
@@ -121,18 +123,23 @@ my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
     }
 );
 
-my $marcflavour = C4::Context->preference('marcflavour');
+our $marcflavour = C4::Context->preference('marcflavour');
 
 if(!$basketno) {
     my $order = GetOrder($ordernumber);
     $basketno = $order->{'basketno'};
 }
 
-my $basket = GetBasket($basketno);
-my $contract = &GetContract($basket->{contractnumber});
+our $basket = GetBasket($basketno);
+$booksellerid = $basket->{booksellerid} unless $booksellerid;
+my $bookseller = Koha::Acquisition::Bookseller->fetch({ id => $booksellerid });
+
+my $contract = GetContract({
+    contractnumber => $basket->{contractnumber}
+});
 
 #simple parameters reading (all in one :-)
-my $params = $input->Vars;
+our $params = $input->Vars;
 my $listprice=0; # the price, that can be in MARC record if we have one
 if ( $ordernumber eq '' and defined $params->{'breedingid'}){
 #we want to import from the breeding reservoir (from a z3950 search)
@@ -167,6 +174,7 @@ if ( $ordernumber eq '' and defined $params->{'breedingid'}){
 
 
 
+my ( @order_user_ids, @order_users );
 if ( $ordernumber eq '' ) {    # create order
     $new = 'yes';
 
@@ -179,6 +187,7 @@ if ( $ordernumber eq '' ) {    # create order
 # otherwise, retrieve suggestion information.
     if ($suggestionid) {
         $data = ($biblionumber) ? GetBiblioData($biblionumber) : GetSuggestion($suggestionid);
+        $budget_id ||= $data->{'budgetid'} // 0;
     }
 }
 else {    #modify order
@@ -186,10 +195,14 @@ else {    #modify order
     $biblionumber = $data->{'biblionumber'};
     $budget_id = $data->{'budget_id'};
 
-    #get basketno and supplierno. too!
-    my $data2 = GetBasket( $data->{'basketno'} );
-    $basketno     = $data2->{'basketno'};
-    $booksellerid = $data2->{'booksellerid'};
+    $basket   = GetBasket( $data->{'basketno'} );
+    $basketno = $basket->{'basketno'};
+
+    @order_user_ids = GetOrderUsers($ordernumber);
+    foreach my $order_user_id (@order_user_ids) {
+        my $order_user = GetMember(borrowernumber => $order_user_id);
+        push @order_users, $order_user if $order_user;
+    }
 }
 
 my $suggestion;
@@ -228,10 +241,11 @@ for my $curr ( @rates ) {
 }
 
 # build branches list
-my $onlymine=C4::Context->preference('IndependantBranches') && 
-            C4::Context->userenv && 
-            C4::Context->userenv->{flags}!=1 && 
-            C4::Context->userenv->{branch};
+my $onlymine =
+     C4::Context->preference('IndependentBranches')
+  && C4::Context->userenv
+  && !C4::Context->IsSuperLibrarian()
+  && C4::Context->userenv->{branch};
 my $branches = GetBranches($onlymine);
 my @branchloop;
 foreach my $thisbranch ( sort {$branches->{$a}->{'branchname'} cmp $branches->{$b}->{'branchname'}} keys %$branches ) {
@@ -260,6 +274,8 @@ foreach my $r (@{$budgets}) {
     push @{$budget_loop}, {
         b_id  => $r->{budget_id},
         b_txt => $r->{budget_name},
+        b_sort1_authcat => $r->{'sort1_authcat'},
+        b_sort2_authcat => $r->{'sort2_authcat'},
         b_active => $r->{budget_period_active},
         b_sel => ( $r->{budget_id} == $budget_id ) ? 1 : 0,
     };
@@ -274,41 +290,8 @@ if ($close) {
 
 }
 
-my $CGIsort1;
-if ($budget) {    # its a mod ..
-    if ( defined $budget->{'sort1_authcat'} ) {    # with custom  Asort* planning values
-        $CGIsort1 = GetAuthvalueDropbox( $budget->{'sort1_authcat'}, $data->{'sort1'} );
-    }
-} elsif(@{$budgets}){
-    $CGIsort1 = GetAuthvalueDropbox(  @$budgets[0]->{'sort1_authcat'}, '' );
-}else{
-    $CGIsort1 = GetAuthvalueDropbox( '', '' );
-}
-
-# if CGIsort is successfully fetched, the use it
-# else - failback to plain input-field
-if ($CGIsort1) {
-    $template->param( CGIsort1 => $CGIsort1 );
-} else {
-    $template->param( sort1 => $data->{'sort1'} );
-}
-
-my $CGIsort2;
-if ($budget) {
-    if ( defined $budget->{'sort2_authcat'} ) {
-        $CGIsort2 = GetAuthvalueDropbox(  $budget->{'sort2_authcat'}, $data->{'sort2'} );
-    }
-} elsif(@{$budgets}) {
-    $CGIsort2 = GetAuthvalueDropbox(  @$budgets[0]->{sort2_authcat}, '' );
-}else{
-    $CGIsort2 = GetAuthvalueDropbox( '', '' );
-}
-
-if ($CGIsort2) {
-    $template->param( CGIsort2 => $CGIsort2 );
-} else {
-    $template->param( sort2 => $data->{'sort2'} );
-}
+$template->param( sort1 => $data->{'sort1'} );
+$template->param( sort2 => $data->{'sort2'} );
 
 if (C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordernumber) {
     # Check if ACQ framework exists
@@ -325,6 +308,27 @@ if (C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordernumber) {
 my @itemtypes;
 @itemtypes = C4::ItemType->all unless C4::Context->preference('item-level_itypes');
 
+if ( defined $subscriptionid ) {
+    my $lastOrderReceived = GetLastOrderReceivedFromSubscriptionid $subscriptionid;
+    if ( defined $lastOrderReceived ) {
+        $budget_id              = $lastOrderReceived->{budgetid};
+        $data->{listprice}      = $lastOrderReceived->{listprice};
+        $data->{uncertainprice} = $lastOrderReceived->{uncertainprice};
+        $data->{gstrate}        = $lastOrderReceived->{gstrate};
+        $data->{discount}       = $lastOrderReceived->{discount};
+        $data->{rrp}            = $lastOrderReceived->{rrp};
+        $data->{ecost}          = $lastOrderReceived->{ecost};
+        $data->{quantity}       = $lastOrderReceived->{quantity};
+        $data->{unitprice}      = $lastOrderReceived->{unitprice};
+        $data->{order_internalnote} = $lastOrderReceived->{order_internalnote};
+        $data->{order_vendornote}   = $lastOrderReceived->{order_vendornote};
+        $data->{sort1}          = $lastOrderReceived->{sort1};
+        $data->{sort2}          = $lastOrderReceived->{sort2};
+
+        $basket = GetBasket( $input->param('basketno') );
+    }
+}
+
 # Find the items.barcode subfield for barcode validations
 my (undef, $barcode_subfield) = GetMarcFromKohaField('items.barcode', '');
 
@@ -335,6 +339,16 @@ $template->param(
     budget_name  => $budget_name
 ) if ($close);
 
+# get option values for gist syspref
+my @gst_values = map {
+    option => $_ + 0.0
+}, split( '\|', C4::Context->preference("gist") );
+
+my $quantity = $input->param('rr_quantity_to_order') ?
+      $input->param('rr_quantity_to_order') :
+      $data->{'quantity'};
+$quantity //= 0;
+
 $template->param(
     existing         => $biblionumber,
     ordernumber           => $ordernumber,
@@ -354,12 +368,15 @@ $template->param(
     suggestionid         => $suggestion->{suggestionid},
     surnamesuggestedby   => $suggestion->{surnamesuggestedby},
     firstnamesuggestedby => $suggestion->{firstnamesuggestedby},
-    biblionumber     => $biblionumber,
-    uncertainprice   => $data->{'uncertainprice'},
-    authorisedbyname => $borrower->{'firstname'} . " " . $borrower->{'surname'},
-    biblioitemnumber => $data->{'biblioitemnumber'},
-    discount_2dp     => sprintf( "%.2f",  $bookseller->{'discount'}) ,   # for display
-    discount         => $bookseller->{'discount'},
+    biblionumber         => $biblionumber,
+    uncertainprice       => $data->{'uncertainprice'},
+    authorisedbyname     => $borrower->{'firstname'} . " " . $borrower->{'surname'},
+    discount_2dp         => sprintf( "%.2f",  $bookseller->{'discount'} ) ,   # for display
+    discount             => $bookseller->{'discount'},
+    orderdiscount_2dp    => sprintf( "%.2f", $data->{'discount'} || 0 ),
+    orderdiscount        => $data->{'discount'},
+    order_internalnote   => $data->{'order_internalnote'},
+    order_vendornote     => $data->{'order_vendornote'},
     listincgst       => $bookseller->{'listincgst'},
     invoiceincgst    => $bookseller->{'invoiceincgst'},
     name             => $bookseller->{'name'},
@@ -376,22 +393,22 @@ $template->param(
     ean              => $data->{'ean'},
     seriestitle      => $data->{'seriestitle'},
     itemtypeloop     => \@itemtypes,
-    quantity         => $data->{'quantity'},
-    quantityrec      => $data->{'quantity'},
+    quantity         => $quantity,
+    quantityrec      => $quantity,
     rrp              => $data->{'rrp'},
-    listprice        => sprintf("%.2f", $data->{'listprice'}||$data->{'price'}||$listprice),
-    total            => sprintf("%.2f", ($data->{'ecost'}||0)*($data->{'quantity'}||0) ),
-    ecost            => $data->{'ecost'},
-    unitprice        => sprintf("%.2f", $data->{'unitprice'}||0),
-    notes            => $data->{'notes'},
+    gst_values       => \@gst_values,
+    gstrate          => $data->{gstrate} ? $data->{gstrate}+0.0 : $bookseller->{gstrate} ? $bookseller->{gstrate}+0.0 : 0,
+    listprice        => sprintf( "%.2f", $data->{listprice} || $data->{price} || $listprice),
+    total            => sprintf( "%.2f", ($data->{ecost} || 0) * ($data->{'quantity'} || 0) ),
+    ecost            => sprintf( "%.2f", $data->{ecost} || 0),
+    unitprice        => sprintf( "%.2f", $data->{unitprice} || 0),
     publishercode    => $data->{'publishercode'},
     barcode_subfield => $barcode_subfield,
-    
     import_batch_id  => $import_batch_id,
-
-# CHECKME: gst-stuff needs verifing, mason.
-    gstrate          => $bookseller->{'gstrate'} // C4::Context->preference("gist") // 0,
-    gstreg           => $bookseller->{'gstreg'},
+    subscriptionid   => $subscriptionid,
+    acqcreate        => C4::Context->preference("AcqCreateItem") eq "ordering" ? 1 : "",
+    users_ids        => join(':', @order_user_ids),
+    users            => \@order_users,
     (uc(C4::Context->preference("marcflavour"))) => 1
 );
 
@@ -447,7 +464,7 @@ sub MARCfindbreeding {
             if (    C4::Context->preference("z3950NormalizeAuthor")
                 and C4::Context->preference("z3950AuthorAuthFields") )
             {
-                my ( $tag, $subfield ) = GetMarcFromKohaField("biblio.author");
+                my ( $tag, $subfield ) = GetMarcFromKohaField("biblio.author", '');
 
 #                 my $summary = C4::Context->preference("z3950authortemplate");
                 my $auth_fields =
@@ -509,7 +526,7 @@ sub Load_Duplicate {
   my ($duplicatetitle)= @_;
   ($template, $loggedinuser, $cookie) = get_template_and_user(
     {
-        template_name   => "acqui/neworderempty_duplicate.tmpl",
+        template_name   => "acqui/neworderempty_duplicate.tt",
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,