Bug 5337: EAN management : Adds ean for various searches
[koha.git] / serials / subscription-add.pl
index 242f7b4..a3306ea 100755 (executable)
@@ -34,17 +34,23 @@ use Carp;
 
 #use Smart::Comments;
 
-my $query = CGI->new;
+our $query = CGI->new;
 my $op = $query->param('op') || '';
 my $dbh = C4::Context->dbh;
 my $sub_length;
 
+my @budgets;
+
+# Permission needed if it is a modification : edit_subscription
+# Permission needed otherwise (nothing or dup) : create_subscription
+my $permission = ($op eq "modify") ? "edit_subscription" : "create_subscription";
+
 my ($template, $loggedinuser, $cookie)
 = get_template_and_user({template_name => "serials/subscription-add.tmpl",
                                query => $query,
                                type => "intranet",
                                authnotrequired => 0,
-                               flagsrequired => {serials => 1},
+                               flagsrequired => {serials => $permission},
                                debug => 1,
                                });
 
@@ -58,14 +64,13 @@ my @sub_type_data;
 
 my $subs;
 my $firstissuedate;
-my $nextexpected;
 
-if ($op eq 'mod' || $op eq 'dup' || $op eq 'modsubscription') {
+if ($op eq 'modify' || $op eq 'dup' || $op eq 'modsubscription') {
 
     my $subscriptionid = $query->param('subscriptionid');
     $subs = GetSubscription($subscriptionid);
 ## FIXME : Check rights to edit if mod. Could/Should display an error message.
-    if ($subs->{'cannotedit'} && $op eq 'mod'){
+    if ($subs->{'cannotedit'} && $op eq 'modify'){
       carp "Attempt to modify subscription $subscriptionid by ".C4::Context->userenv->{'id'}." not allowed";
       print $query->redirect("/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=$subscriptionid");
     }
@@ -79,11 +84,13 @@ if ($op eq 'mod' || $op eq 'dup' || $op eq 'modsubscription') {
             $subs->{$_} = format_date($subs->{$_});
         }
          }
-    $subs->{'letter'}='' unless($subs->{'letter'});
+      if (!defined $subs->{letter}) {
+          $subs->{letter}= q{};
+      }
     letter_loop($subs->{'letter'}, $template);
-    $nextexpected = GetNextExpected($subscriptionid);
+    my $nextexpected = GetNextExpected($subscriptionid);
     $nextexpected->{'isfirstissue'} = $nextexpected->{planneddate}->output('iso') eq $firstissuedate ;
-    $subs->{nextacquidate} = $nextexpected->{planneddate}->output()  if($op eq 'mod');
+    $subs->{nextacquidate} = $nextexpected->{planneddate}->output()  if($op eq 'modify');
     unless($op eq 'modsubscription') {
                foreach my $length_unit qw(numberlength weeklength monthlength){
                        if ($subs->{$length_unit}){
@@ -93,18 +100,24 @@ if ($op eq 'mod' || $op eq 'dup' || $op eq 'modsubscription') {
                        }
                }
 
-        $template->param($subs);
+        $template->param( %{$subs} );
         $template->param("dow".$subs->{'dow'} => 1) if defined $subs->{'dow'};
         $template->param(
                     $op => 1,
                     "subtype_$sub_on" => 1,
                     sublength =>$sub_length,
-                    history => ($op eq 'mod'),
+                    history => ($op eq 'modify'),
                     "periodicity".$subs->{'periodicity'} => 1,
                     "numberpattern".$subs->{'numberpattern'} => 1,
                     firstacquiyear => substr($firstissuedate,0,4),
                     );
     }
+
+    if ( $op eq 'dup' ) {
+        my $dont_copy_fields = C4::Context->preference('SubscriptionDuplicateDroppedInput');
+        my @fields_id = map { fieldid => $_ }, split '\|', $dont_copy_fields;
+        $template->param( dont_export_field_loop => \@fields_id );
+    }
 }
 
 my $onlymine=C4::Context->preference('IndependantBranches') &&
@@ -115,7 +128,6 @@ my $branches = GetBranches($onlymine);
 my $branchloop;
 for my $thisbranch (sort { $branches->{$a}->{branchname} cmp $branches->{$b}->{branchname} } keys %{$branches}) {
     my $selected = 0;
-    $selected = 1 if ($thisbranch eq C4::Context->userenv->{'branch'});
     $selected = 1 if (defined($subs) && $thisbranch eq $subs->{'branchcode'});
     push @{$branchloop}, {
         value => $thisbranch,
@@ -123,13 +135,18 @@ for my $thisbranch (sort { $branches->{$a}->{branchname} cmp $branches->{$b}->{b
         branchname => $branches->{$thisbranch}->{'branchname'},
     };
 }
+
+my $locations_loop = GetAuthorisedValues("LOC",$subs->{'location'});
+
 $template->param(branchloop => $branchloop,
     DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+    locations_loop=>$locations_loop,
 );
-my $count = 0;
 # prepare template variables common to all $op conditions:
-$template->param(  'dateformat_' . C4::Context->preference('dateformat') => 1 ,
-                );
+$template->param(  'dateformat_' . C4::Context->preference('dateformat') => 1 );
+if ($op!~/^mod/) {
+    letter_loop(q{}, $template);
+}
 
 if ($op eq 'addsubscription') {
     redirect_add_subscription();
@@ -146,10 +163,9 @@ if ($op eq 'addsubscription') {
            }
            push( @sub_type_data, \%row );
         }
-    $template->param(subtype => \@sub_type_data,
-       );
+    $template->param(subtype => \@sub_type_data);
 
-    letter_loop('', $template);
+    letter_loop( '', $template ) if ($op ne 'modsubscription' && $op ne 'dup' && $op ne 'modify');
 
     my $new_biblionumber = $query->param('biblionumber_for_new_subscription');
     if (defined $new_biblionumber) {
@@ -159,22 +175,22 @@ if ($op eq 'addsubscription') {
             $template->param(bibliotitle => $bib->{title});
         }
     }
+        $template->param((uc(C4::Context->preference("marcflavour"))) => 1);
        output_html_with_http_headers $query, $cookie, $template->output;
 }
 
 sub letter_loop {
     my ($selected_letter, $templte) = @_;
     my $letters = GetLetters('serial');
-    my @letterloop;
-    foreach my $thisletter (keys %$letters) {
-        my $selected = $thisletter eq $selected_letter ? 1 : 0;
-        push @letterloop, {
+    my $letterloop;
+    foreach my $thisletter (keys %{$letters}) {
+        push @{$letterloop}, {
             value => $thisletter,
-            selected => $selected,
+            selected => $thisletter eq $selected_letter,
             lettername => $letters->{$thisletter},
         };
     }
-    $templte->param(letterloop => \@letterloop) if @letterloop;
+    $templte->param(letterloop => $letterloop);
     return;
 }
 
@@ -189,52 +205,52 @@ sub _get_sub_length {
 }
 
 sub redirect_add_subscription {
-    my $auser           = $query->param('user');
-    my $branchcode      = $query->param('branchcode');
-    my $aqbooksellerid  = $query->param('aqbooksellerid');
-    my $cost            = $query->param('cost');
-    my $aqbudgetid      = $query->param('aqbudgetid');
-    my $periodicity     = $query->param('periodicity');
-    my $dow             = $query->param('dow');
-    my @irregularity    = $query->param('irregularity_select');
-    my $numberpattern   = $query->param('numbering_pattern');
-    my $graceperiod     = $query->param('graceperiod') || 0;
+    my $auser          = $query->param('user');
+    my $branchcode     = $query->param('branchcode');
+    my $aqbooksellerid = $query->param('aqbooksellerid');
+    my $cost           = $query->param('cost');
+    my $aqbudgetid     = $query->param('aqbudgetid');
+    my $periodicity    = $query->param('periodicity');
+    my $dow            = $query->param('dow');
+    my @irregularity   = $query->param('irregularity_select');
+    my $numberpattern  = $query->param('numbering_pattern');
+    my $graceperiod    = $query->param('graceperiod') || 0;
 
-    my ($numberlength, $weeklength, $monthlength)
+    my ( $numberlength, $weeklength, $monthlength )
         = _get_sub_length( $query->param('subtype'), $query->param('sublength') );
-    my $add1 = $query->param('add1');
-    my $every1 = $query->param('every1');
-    my $whenmorethan1 = $query->param('whenmorethan1');
-    my $setto1 = $query->param('setto1');
-    my $lastvalue1 = $query->param('lastvalue1');
-    my $innerloop1 =$query->param('innerloop1');
-    my $add2 = $query->param('add2');
-    my $every2 = $query->param('every2');
-    my $whenmorethan2 = $query->param('whenmorethan2');
-    my $setto2 = $query->param('setto2');
-    my $innerloop2 =$query->param('innerloop2');
-    my $lastvalue2 = $query->param('lastvalue2');
-    my $add3 = $query->param('add3');
-    my $every3 = $query->param('every3');
-    my $whenmorethan3 = $query->param('whenmorethan3');
-    my $setto3 = $query->param('setto3');
-    my $lastvalue3 = $query->param('lastvalue3');
-    my $innerloop3 =$query->param('innerloop3');
-    my $numberingmethod = $query->param('numberingmethod');
-    my $status = 1;
-    my $biblionumber = $query->param('biblionumber');
-    my $callnumber = $query->param('callnumber');
-    my $notes = $query->param('notes');
-    my $internalnotes = $query->param('internalnotes');
-    my $hemisphere = $query->param('hemisphere') || 1;
-       my $letter = $query->param('letter');
-    my $manualhistory = $query->param('manualhist');
-    my $serialsadditems = $query->param('serialsadditems');
-       my $staffdisplaycount = $query->param('staffdisplaycount');
-       my $opacdisplaycount = $query->param('opacdisplaycount');
-    my $location = $query->param('location');
-    my $startdate       = format_date_in_iso($query->param('startdate'));
-    my $enddate       = format_date_in_iso($query->param('enddate'));
+    my $add1              = $query->param('add1');
+    my $every1            = $query->param('every1');
+    my $whenmorethan1     = $query->param('whenmorethan1');
+    my $setto1            = $query->param('setto1');
+    my $lastvalue1        = $query->param('lastvalue1');
+    my $innerloop1        = $query->param('innerloop1');
+    my $add2              = $query->param('add2');
+    my $every2            = $query->param('every2');
+    my $whenmorethan2     = $query->param('whenmorethan2');
+    my $setto2            = $query->param('setto2');
+    my $innerloop2        = $query->param('innerloop2');
+    my $lastvalue2        = $query->param('lastvalue2');
+    my $add3              = $query->param('add3');
+    my $every3            = $query->param('every3');
+    my $whenmorethan3     = $query->param('whenmorethan3');
+    my $setto3            = $query->param('setto3');
+    my $lastvalue3        = $query->param('lastvalue3');
+    my $innerloop3        = $query->param('innerloop3');
+    my $numberingmethod   = $query->param('numberingmethod');
+    my $status            = 1;
+    my $biblionumber      = $query->param('biblionumber');
+    my $callnumber        = $query->param('callnumber');
+    my $notes             = $query->param('notes');
+    my $internalnotes     = $query->param('internalnotes');
+    my $hemisphere        = $query->param('hemisphere') || 1;
+    my $letter            = $query->param('letter');
+    my $manualhistory     = $query->param('manualhist');
+    my $serialsadditems   = $query->param('serialsadditems');
+    my $staffdisplaycount = $query->param('staffdisplaycount');
+    my $opacdisplaycount  = $query->param('opacdisplaycount');
+    my $location          = $query->param('location');
+    my $startdate = format_date_in_iso( $query->param('startdate') );
+    my $enddate = format_date_in_iso( $query->param('enddate') );
     my $firstacquidate  = format_date_in_iso($query->param('firstacquidate'));
     my $histenddate = format_date_in_iso($query->param('histenddate'));
     my $histstartdate = format_date_in_iso($query->param('histstartdate'));
@@ -316,6 +332,7 @@ sub redirect_mod_subscription {
        my $opacdisplaycount = $query->param('opacdisplaycount');
     my $graceperiod     = $query->param('graceperiod') || 0;
     my $location = $query->param('location');
+    my $nextexpected = GetNextExpected($subscriptionid);
        #  If it's  a mod, we need to check the current 'expected' issue, and mod it in the serials table if necessary.
     if ( $nextacquidate ne $nextexpected->{planneddate}->output('iso') ) {
         ModNextExpected($subscriptionid,C4::Dates->new($nextacquidate,'iso'));